质数的判定--试除法
#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;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!