质数的判定--试除法

#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;

 

posted on 2023-05-26 00:24  不是小朋友L  阅读(13)  评论(0编辑  收藏  举报

导航