is_PRime() 方法不適合用在n太大或者n太小的情況下. 1.n太小,n=1會被錯誤的判斷為素數. 2.n太大,i*i可能會溢出,如果n是最大值的素數,i=463640,i*i=2147395600
#include<iostream>#include<fstream>#include<assert.h>//#define LOCALusing namespace std;//ifstream fin("input.txt");//ofstream fout("output.txt");bool is_prime(int x){ int i, m; assert(x >= 0); //斷言語句 如果不滿足條件 程序直接退出 if (x == 1) return false; m = floor(sqrt(x) + 0.5); //floor為向下取整 floor(x+0.5)就是四舍五入 for (int i = 2; i <= m; i++) //假設數m = p*q, 且p≤q則m = p*q≥p*p即p≤√m所以m必有一個小于或等于其平方根的因數, 那么驗證素數時就只需要驗證到其平方根就可以了 if (x%i == 0) return false; return true;}int main(){#ifdef LOCAL freopen("input.txt", "r", stdin); //能讓cin 和 scanf 從 input.txt 讀入 freopen("output.txt", "w", stdout); //能讓printf 和 cout 輸出到 output.txt#endif // LOCAL int n; while (cin>>n) //用fin替代就是從文件輸入 { if (is_prime(n)) cout << "Prime/n"; //用fout 替代則是輸出到文件 else cout << "Not/n"; } return 0;}新聞熱點
疑難解答