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;}新闻热点
疑难解答