质数的判定--试除法
#include <iostream> #include <cstring> #include <algorithm> bool is_prime(int n){ if(n<2)return false; for(int i=2;i<=n/i;i++) if(n%i==0)return false; return true; } using namespace std; int main() { int n; cin>>n; while(n--){ int m; cin>>m; if(is_prime(m)) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; }
在这个代码中,我们可以看到一个细节的地方在于函数里面的for循环
如果是不对代码进行优化写法就有很多种,如下:
for(int i=2;i<=n;i++)
这种就是最暴力的做法,直接对n个数进行试除,枚举的个数多了,就会变的速度慢了.
for(int i=2;i<=sqrt(n);i++)
这种方法虽然枚举的个数变少了,但是呢,sqrt()函数会耗费一定的时间,而且每次都要计算一次,就会导致这个速度变得很慢,所以也不是一个很好的方法.
for(int i=2;i*i<=n;i++)
这个看起来人畜无害,好像没什么问题,是否我们可以采用一下这种方式呢?
分为两点:i*i是不是要花时间,但是时间还是小事,无非就是慢一点嘛,但是如果发生错误了,才是最不好的,
其中我们可以看到这个i*i,如果这个i是一个很接近于int的最大值的数,那么i*i是不是就会溢出了,
溢出之后的数就是等于0,0就会导致始终小于这个n,循环也就一直不会终止,就发生了错误。。。。。。
所以呢,综合我上面说的一些东西,我们知道的关键代码:
一是:
for(int i=2;i<=n/i;i++)
二是:
if(n%i==0)return false;