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

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

现在只能打出我能看懂的

主要思路就是:

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值