您的位置:首页 > 其它

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

2017-03-11 21:40 295 查看
网上搜了很久有几个特别好的没看懂

现在只能打出我能看懂的

主要思路就是:

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;//17
if(n%c==0)
return false;
c+=2;//19
if(n%c==0)
return false;
c+=4;//23
if(n%c==0)
return false;
c+=6;//29
if(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: