网上刷编程题的时候经常会遇到与素数相关的问题,通过某些方法可以判断某个数i是否为素数,但大多都是判断i%j的值,这些方法耗时不同,在i开的有些大时会有明显的差距(此处用noi.openjudge.cn上面的题目做例子)
工具/原料
方法一:
1源代码如下:#include#includeusing namespace std;bool b[99999];//可以改数组大小int main(){ for(int i=0;i<=99999;i++) b[i]=true; int a; scanf('%d',&a); for(int i=2;i<=sqrt(a);i++) for(int j=2;j<=a;j++) if(b[j]&&i!=j&&j%i==0) b[j]=false; if(b[a]) printf('true'); else printf('false'); return 0;}按照题目要求修改即可
2这种方法是从数字2开始筛每一个数,筛到所需要的数字停止即可。最大是用sqrt(i)筛到i,最后判断b[i]的bool值判断是否为素数。
3通过图片可以看出,程序超时了,因为满足题意的情况下数组开的太大,循环判断素数用时太久。
方法二:
1源代码如下:#include#includeusing namespace std;int main(){ int a,sum=2; scanf('%d',&a); for(int i=4;;++i) { if(sum==a) {printf('%d',i-1);break;} bool bo=true; for(int j=2;j<=sqrt(i);++j) if(i%j==0) {bo=false;break;} if(bo) sum++; } return 0;}从记录里copy来格式基本没了。。。
2这种方法判断一个数时不用筛,而是与前面的数取余看结果是否为0
方法三:
1原代码如下:#include#includeusing namespace std;int main(){ int a,sum=2,i=4; bool bo; scanf('%d',&a); if(a<=2) {a==1?cout<<'2':cout<<'3';return 0;} while(sum
2大致思路与二相似,但是用sum做循环的判断条件而不是i,里面的循环体基本相同,但是sqrt换成了*。
注意事项
如果是方法一,是第n个质数不是数组开10000//本人还是个萌新啦,有的地方写得不好还请多多包涵。