c之孿生素數 錯誤總結

2021-06-26 18:47:14 字數 1083 閱讀 2626

#include

#include

int isprime(int e)

return 1;}}

int main()

}while(n--)

}printf("%d\n",turn);

}return 0;

}出現的問題:

1.求素數:

普通求素數的方法

在判斷能不能被1和他本身的其他數字整除的時候,即  for(i=2;i<=sqrt(e);i++)

這條語句中一般判斷的條件式sqrt(i)或者是i/2,但是這兩種方法所用的時間是不同的,迴圈次數前者較少,可以減少程式的執行時間,在以後的**編寫中 ,盡量全部都用前者,也就是開平方。

(在此補充一下為什麼判斷到開平方就可以:因為乙個數如果他不是素數的話,就是兩個數的乘積,這兩個因子中一定有乙個是小於sqrt的,所以說只要找到較小的因子就行了)

2.超時怎麼辦,迴圈次數太多怎麼辦

因為這個**中要求有多組測試資料,所以我在原來的**中先有乙個while迴圈,表示測試資料的組數,再在while裡呼叫乙個有兩重for迴圈的判斷素數的函式,這樣迴圈就一共有三層了,時間複雜度就大大增加了。所以,最終,我想了乙個辦法,先求出要求的某範圍內的所有的素數,放在乙個陣列中,這是一點;再乙個就是,就像這道題目中的要求,要求輸入的數字不超過一百萬萬,所以我就定義了乙個1000001的陣列存放1000001以內的素數,在最後的判斷中:

for(int j=1;(count[j]<=m)&&count[j]!=0;j++)

我原來的**是沒有count [ j ]!=0這個條件的話,會有這麼一種情況,假如你的m值是999999,而你判斷的素數值是從0到1000002的話999983就是最後乙個素數,判斷時他是最後乙個,而且他是小於1000002的,所以還會進行一次迴圈,使i+1,但是999983是最後乙個素數了,陣列裡下乙個數值就是0了,這樣的話,永遠都會小於m,迴圈就會進行下去,造成程式錯誤。所以得加上count [i]!=0的條件。如果沒有這個的話,也可以讓我們尋找素數的範圍擴大到1000005,這樣的話,下乙個素數就是1000003,他是大於1000000的,這樣會使程式正確的停止。總結為這樣,必須讓找出來的素數中最後乙個是大於你給出的數值m。

C 孿生素數

所謂孿生素數指的是間隔為2的相鄰的素數,他們之間的距離已經近得不能再近了,就像孿生兄弟一樣,最小的孿生素數是 3,5 在100以內還有 5,7 11,13 17,19 17,19 29,31 41,43 59,61 71,73 總計8組。但隨著數字的增大,孿生素數的分布越來越稀疏,尋找起來也變得困難...

C語言(17)孿生素數問題

描述 寫乙個程式,找出給出素數範圍內的所有孿生素數的組數。一般來說,孿生素數就是指兩個素數距離為2,近的不能再近的相鄰素數。有些童鞋一看到題就開始寫程式,不仔細看題,咱們為了遏制一下讀題不認真仔細的童鞋,規定,兩個素數相鄰為1的也成為孿生素數。輸入第一行給出n 0輸出 每組測試資料輸出佔一行,該行為...

python 小數錯誤處理總結

原 版本 n1,n2 raw input split raw input split res str reduce lambda a,b 10a b,map lambda x ord x 0 ord x 1 2ord 0 list z l n1 1 1 n2 1 1 fillvalue 0 1 c ...