#2885: 找不到錯誤~~~


amy99778 (K)

學校 : 臺北市立第一女子高級中學
編號 : 9835
來源 : [220.135.41.146]
最後登入時間 :
2012-06-12 23:03:01
a007. 判斷質數 | From: [220.135.41.146] | 發表日期 : 2009-11-29 22:54

麻煩了

以下是程式碼OTZ 

 

 

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
int main(void)
{
    long long int i,N,count=0; 
    scanf("%I64d",&N) ;
    count=0;

    for(i=1 ; i<=sqrt(N) ; i++)
    {
        if(N%i==0 && i!=sqrt(N))
        {
                    count+=2;
            printf("%I64d %I64d ",i,N/i);

        }
        else if(N%i==0 && i==sqrt(N))
        {
            printf("%I64d ",i);
            count++;
        }
        }
    if(N<=1)printf("非質數");
    else if(count==2)printf("質數\n");
    else{
         printf("非質數\n");
         } 
     

    return 0;
   

}

 
#2887: Re:找不到錯誤~~~


example (學姊)

學校 : 臺北市立麗山高級中學
編號 : 6634
來源 : [60.250.138.144]
最後登入時間 :
2022-08-09 17:07:42
a007. 判斷質數 | From: [118.166.112.185] | 發表日期 : 2009-11-29 23:48

 判斷質數大家一定會想到最基本的作法:從 1 除到 n , 只有 1 跟 n 整除的話就是質數

 但是這樣 2 的倍數都多檢查了

 接下來

 每個數的因數都是成雙成對出現

 除了完全平方數 ex: 4 = 1 * 4 = 2 * 2 還有 36 = 1 * 36 = 2 * 18 = 3 * 12 = 4 * 9 = 6 * 6

 從這裡可以發現過了 根號n 以後

 可以整除的數都可以在小於 根號n 的部分找到一個數字相乘並等於 n

 所以檢查大於 根號n 的部分是浪費時間 ( 很多人 TLE 的原因 !! )

 那麼經過上面兩點

 我們在檢查某數 n 的時候

 要先看看 n 是不是 2 的倍數

 再從 2 開始檢查到 根號 n 

 如果都沒有數可以整除 n

 那麼 n 就是質數

 以上就是這題要考的觀念

 當然還有更快的做法

 那就請大家自己再去研究吧

 
ZeroJudge Forum