#7690: 怎麼做才能增快速度?


max8783890 (HelloWorld)

學校 : 國立臺北科技大學
編號 : 32398
來源 : [219.91.10.219]
最後登入時間 :
2021-09-27 23:33:59
a007. 判斷質數 | From: [1.172.118.10] | 發表日期 : 2013-04-19 01:23

我已經盡力了 不知道還能改善什麼

每次出來都是TLE

-------------------------------------------

#include <stdio.h>

#include <stdlib.h>

int main()

{

    int i,j,c;

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

    {

    

        for(i=2; i<=j ;i++)

        {

            

            if(j%i == 0)

            {

               c++;

            }

        }

        if(c == 1)

        {

             printf("質數"); 

        }

        else

        {

             printf("非質數"); 

        }

         c =0;                   

                        

    }

    return 0;

    

}

 

 
#7691: Re:怎麼做才能增快速度?


akira0331 (小迷糊)

學校 : 不指定學校
編號 : 26613
來源 : [203.70.194.240]
最後登入時間 :
2013-07-29 09:30:29
a007. 判斷質數 | From: [203.70.194.240] | 發表日期 : 2013-04-19 11:01

我已經盡力了 不知道還能改善什麼

每次出來都是TLE

-------------------------------------------

#include

#include

int main()

{

    int i,j,c;

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

    {

 

        for(i=2; i<=j ;i++)

        {

 

            if(j%i == 0)

            {

               c++;

            }

        }

        if(c == 1)

        {

             printf("質數"); 

        }

        else

        {

             printf("非質數"); 

        }

         c =0;                   

 

    }

    return 0;

 

}

 


將迴圈改寫 for(i=2; i<=sqrt(j) ;i++), 跑迴圈的次數會少很多

後面程式的寫法也有些問題要修改,我的做法是當j%i==0就 break 不要再跑迴圈,

因為可以被某數整除就不是質數

要先排除 1, 2, 3 ,1不是質數, 2, 3是質數

 
#7693: Re:怎麼做才能增快速度?


max8783890 (HelloWorld)

學校 : 國立臺北科技大學
編號 : 32398
來源 : [219.91.10.219]
最後登入時間 :
2021-09-27 23:33:59
a007. 判斷質數 | From: [1.172.120.103] | 發表日期 : 2013-04-19 17:42

我已經盡力了 不知道還能改善什麼

每次出來都是TLE

-------------------------------------------

#include

#include

int main()

{

    int i,j,c;

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

    {

 

        for(i=2; i<=j ;i++)

        {

 

            if(j%i == 0)

            {

               c++;

            }

        }

        if(c == 1)

        {

             printf("質數"); 

        }

        else

        {

             printf("非質數"); 

        }

         c =0;                   

 

    }

    return 0;

 

}

 


將迴圈改寫 for(i=2; i<=sqrt(j) ;i++), 跑迴圈的次數會少很多

後面程式的寫法也有些問題要修改,我的做法是當j%i==0就 break 不要再跑迴圈,

因為可以被某數整除就不是質數

要先排除 1, 2, 3 ,1不是質數, 2, 3是質數 

j%i==0 要 這樣嗎 if(j%i==0&&j!=i) break;?

還有就是 為什麼要取j的平方根?~ 

 
#7705: Re:怎麼做才能增快速度?


akira0331 (小迷糊)

學校 : 不指定學校
編號 : 26613
來源 : [203.70.194.240]
最後登入時間 :
2013-07-29 09:30:29
a007. 判斷質數 | From: [203.70.194.240] | 發表日期 : 2013-04-25 19:29

我已經盡力了 不知道還能改善什麼

每次出來都是TLE

-------------------------------------------

#include

#include

int main()

{

    int i,j,c;

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

    {

 

        for(i=2; i<=j ;i++)

        {

 

            if(j%i == 0)

            {

               c++;

            }

        }

        if(c == 1)

        {

             printf("質數"); 

        }

        else

        {

             printf("非質數"); 

        }

         c =0;                   

 

    }

    return 0;

 

}

 


將迴圈改寫 for(i=2; i<=sqrt(j) ;i++), 跑迴圈的次數會少很多

後面程式的寫法也有些問題要修改,我的做法是當j%i==0就 break 不要再跑迴圈,

因為可以被某數整除就不是質數

要先排除 1, 2, 3 ,1不是質數, 2, 3是質數 

j%i==0 要 這樣嗎 if(j%i==0&&j!=i) break;?

還有就是 為什麼要取j的平方根?~ 

 

只要寫 if(j%i==0) break; 就行了,因 i的迴圈只做到<=sqrt(j)而以,所以j!=i。
用sqrt(j)是判斷質數常用的方法之一,有人會用 j/2,但sqrt(j)<=j/2,可以少了一些不必要的迴圈數

 
ZeroJudge Forum