质数的判定--试除法

复制代码
#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   不是小朋友L  阅读(37)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示