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


jonas7441 (ghost7441)


大大們好:

以下是小弟我的程碼,第一我的程式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 (小迷糊)


大大們好:

以下是小弟我的程碼,第一我的程式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)


thank you