求n以内的最大素数,若n最大为21亿

来源:互联网 发布:sqlserver is null 编辑:程序博客网 时间:2024/05/01 08:28

网上搜了很久有几个特别好的没看懂

现在只能打出我能看懂的

主要思路就是:

1:若n不为素数,则在sqrt(n)内一定有一个n的因子

2:利用算法将2到sqrt(n)中的2,3,5的倍数去掉,减少了n/10*3的时间复杂度

#include<stdio.h>#include <math.h>bool is_sushu(long long n);int main(){long long n;bool flag ;while(true){      scanf("%I64d",&n);while(n--){flag =is_sushu(n);if(flag == true)break;}printf("%I64d\n",n);}} bool is_sushu(long long n){if(n==3||n==5||n==2)return true;if(n%2==0 || n%3==0 || n%5==0)//排除掉2,3,5的倍数 return false;long long c = 7;long long Cmax = (long long) sqrt(n);//如果n为素数则sqrt(n)内必定存在一个它的因子while(c<Cmax)//通过下列的判断将2,3,5的倍数直接排除掉,减少循环的次数 {if(n%c==0)return false;c+=4;//第一次c为11 if(n%c==0)return false;c+=2;// 13 if(n%c==0)return false;c+=4;//17if(n%c==0)return false;c+=2;//19if(n%c==0)return false;c+=4;//23if(n%c==0)return false;c+=6;//29if(n%c==0)return false;c+=2;//31 if(n%c==0)return false;c+=6;//37//下一个应该是41,又是+4,//下一个应该是43,又是+2//……………………虽然不知道为什么会出现这种循环但事实就是这样 } return true;//据说这个的时间复杂度为o((sqrt(n)/10)*7) }
//下面的是我用普通的方式写的,发现几分钟都运行不出来bool is_sushu(long long n){long long i = 1;for(i =2;i<n;i++){if(n%i==0)return false;}return true;}


0 0