#8884: (C語言)試了一些別人提供的方法,仍逾時!!


hank850503 (hank850503)

學校 : 不指定學校
編號 : 41355
來源 : [49.216.244.184]
最後登入時間 :
2019-04-22 16:49:27
a007. 判斷質數 | From: [1.170.13.230] | 發表日期 : 2014-06-21 14:16

我是最近開始學習程式語言,但一下就被這題卡住了...
不管怎麼試都一直逾時,於是到討論區爬文,但是...有夠亂 = ='' ,都不註記是哪種程式語言,找C語言找的好累!
最後寫出2種方法,仍逾時,只好發文求救了大哭

第一種

#include<stdio.h>

#include<math.h>

 

int main(void)

{

    int a,b,i,s;                          /*a是輸入的數,b是餘數,s=√a*/

    while(scanf("%d",&a)!=EOF)

    {

    s=sqrt(a);

    for(i=2;i<=s+1;i++)             /*檢查除以2~√a的餘數*/

    {

          b=a%i;

          if(b==0)

          break;

    }

    if(b==0)

    printf("非質數\n");

    

    if(b!=0)

    printf("質數\n"); 

    } 

 

    return 0;

}  

第二種  先檢驗是否為2或3的倍數,如果不是,只需檢查6n+1及6n+5

#include<stdio.h>

#include<math.h>

int main(void)

{

    int a,jud=0,con,con2=0;       /*a是輸入的數,jud=0是質數,jud=1非質數,con是除數,con2讓con一次+4一次+2 */

    while(scanf("%d",&a)!=EOF){

    

    if(a%2==0)

    jud=1;

    if(a%3==0)

    jud=1;

    if(a==2||a==3)

    jud=0;

    for(con=5;con<=sqrt(a)&&jud==0;)

    {

         if(a%con==0)

         jud=1;

         if(con2==0)

         {

          con+=2;

          con2++;

         }

         if(con2==1)

         {

          con+=4;

          con2--;

         }

    }

    if(jud==0)

    printf("質數\n");

    else

    printf("非質數\n");

    jud=0;

}

    return 0;

}  

 

希望有人可以給點建議,再簡化程式 

至於討論區中有些人建議的"建表"還沒學過,也可提供學習資源給我太可笑嘍

 
#8911: Re:(C語言)試了一些別人提供的方法,仍逾時!!


dibery (Bor)

學校 : 政治大學
編號 : 23441
來源 : [119.14.19.119]
最後登入時間 :
2016-04-07 01:20:18
a007. 判斷質數 | From: [140.119.120.6] | 發表日期 : 2014-06-26 18:49

建表...其實就是用篩法

速度很快

http://zh.wikipedia.org/zh-tw/%E5%9F%83%E6%8B%89%E6%89%98%E6%96%AF%E7%89%B9%E5%B0%BC%E7%AD%9B%E6%B3%95

可以只建到46340

然後只和小於46340的質數試除判斷 (若一數可被合數整除,則亦可被此合數之質因數整除)

 
ZeroJudge Forum