#7825: 為何逾時 ,要如何改


jonas7441 (ghost7441)

學校 : 崑山科技大學
編號 : 32228
來源 : [36.238.203.182]
最後登入時間 :
2016-08-22 10:26:59
a007. 判斷質數 | From: [120.114.151.7] | 發表日期 : 2013-06-05 10:41

大大們好:

以下是小弟我的程碼,第一我的程式compile正確且執行無誤,但就是逾時,要如何改才不會逾時

                           第二為何別人要用sqrt() 這個開根號 

懇請大大們說明

#include<stdio.h>
main(){    
int x,i;
   
  while(scanf("%d",&x)!=EOF)
   {
    int ans=0;
    for(i=2;i<x;i++)
     {
      if((x%i)==0)
      {
        ans++;
        break;
       }
      else continue;
            
     }
     if(ans==0) printf("質數\n");
     else printf("非質數\n");
   }
return 0;
}

 
#7826: Re:為何逾時 ,要如何改


akira0331 (小迷糊)

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

大大們好:

以下是小弟我的程碼,第一我的程式compile正確且執行無誤,但就是逾時,要如何改才不會逾時

                           第二為何別人要用sqrt() 這個開根號 

懇請大大們說明

#include
main(){    
int x,i;
   
  while(scanf("%d",&x)!=EOF)
   {
    int ans=0;
    for(i=2;i     {
      if((x%i)==0)
      {
        ans++;
        break;
       }
      else continue;
            
     }
     if(ans==0) printf("質數\n");
     else printf("非質數\n");
   }
return 0;
}

 

因為for(i=2;i<x;i++) 太慢了,而x 的最大因數可能是sqrt(x), 或小於sqrt(x)

所以只要寫 for(i=2; i<=sqrt(x) ;i++), 跑迴圈的次數會少很多

要先排除 1, 1不是質數

用sqrt(j)是判斷質數常用的方法之一,有人會用 j/2,但sqrt(j)<=j/2,可以少了一些不必要的迴圈數

 
#7835: Re:為何逾時 ,要如何改


jonas7441 (ghost7441)

學校 : 崑山科技大學
編號 : 32228
來源 : [36.238.203.182]
最後登入時間 :
2016-08-22 10:26:59
a007. 判斷質數 | From: [114.39.21.194] | 發表日期 : 2013-06-07 17:11

thank you 



 
ZeroJudge Forum