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


hank850503 (hank850503)


我是最近開始學習程式語言,但一下就被這題卡住了...
不管怎麼試都一直逾時,於是到討論區爬文,但是...有夠亂 = ='' ,都不註記是哪種程式語言,找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)


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

速度很快

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的質數試除判斷 (若一數可被合數整除,則亦可被此合數之質因數整除)