素数筛选最优法

这段代码展示了如何优化算法,快速找出1到100010之间的所有素数。通过减少循环次数(优化点1)、避免重复标记非素数(优化点2)和从i的平方开始标记其倍数(优化点3),实现了效率提升。程序读取输入数值并判断是否为素数,输出相应结果。
摘要由CSDN通过智能技术生成
#include<iostream>
using namespace std;
bool str[100010]; 					//开始定义一个全局变量数组 
void prime()						//这个函数可以将1~100010内的所有素数都找出来,所以在main()函数开头执行一遍就行了 
{
	str[1] = 1;						
	for(int i=2;i*i<=100010;i++)    //优化点1:
	{
		if(!str[i])                 //优化点2:
		{
			for(int j=i*i;j<=100010;j+=i)    //优化点3:
			str[j] = 1;	
		}				
	}
}
int main()
{
	prime(); 						 //执行程序开始的打表操作 
	int n;							
	while(cin>>n)
	{
		if(str[n]) cout<<"不是素数!"<<endl; 	//判断是否为素数 
		else cout<<"是素数!"<<endl;
	}
	return 0;
}

优化点1: 范围为0~10000时,即循环到i = 100时即可,因为从100 ~ 10000中所有的非素数都是1~100中数的倍数,首先要先找到一个100 ~ 10000中的非素数,那么它除了1和它本身,应该还会有1个或多个因子,假设其中一个因子在10000中间,那么与其对应的另外一个因子一定在100中间否则两个数相乘会大于10000,比如9999,他的一个因子是101,那么对应的另外一个因子就是99,该数会在第二层循环完成标记

优化点2:当i不是素数时,会产生重复标记

优化点3:假设刚开始i = 2的时候,是不是把 i 的倍数都标记成1了?那么2 * 3肯定也被标记成1了,所以当 i 运行到等于3的时候就没必要在把3 * 2给标记一遍了是不?要不然就又重复标记了,同理,在 i = 4的时候,那么4 * 2 和4 3是不是在i = 2 ,i = 3 的时候分别被标记过了,所以在循环第二层的时候从j = 4 4(int j = ii)开始就好了
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值