欧拉筛 找素数 算法

核心思想:最小质因数(prime[j])×最大因数(i)=一个合数   并保证每个合数只筛查一遍


因为若i为合数,则最小质因数(prime[j])和最大因数(i)一定在i-1之内,而经过筛选后没有筛掉i

,那么i就是素数

if (a[i] != 1)
		{
			prime[num] = i;         
			num++;     
		}

if (i % prime[j] == 0) break;           //余数为0说明prime[j]为i的最小质因数,由于

      余数为0说明prime[j]为i的最小质因数,(因为prime中质数由小到大排列)

这一步就保证了不会重筛,堪称神来之笔!


#include <stdio.h>
int n;                //范围
int a[100000003] ;   //筛素数 初始化都为0,赋值1则不是素数
int prime[10000000];//存素数
int num;//记录素数个数
void isprime();
int main() {
	
	scanf("%d", &n);
	isprime();
	for (int i = 0; i <num; i++) {
		printf("%d", prime[i]);
	}		
	return 0;
}
void isprime() {
	for (int i = 2; i <=n; i++) {      //i<n 不能把写为i<=sqrt(n),由于每次for循环是将i筛出来,那么必须筛到n
		if (a[i] != 1)
		{
			prime[num] = i;         
			num++;     
		}
			for (int j = 0; j < num&& prime[j] * i <= n; j++) {  
				a[prime[j] * i] = 1;                  //将合数=最小质因数×最大因数 筛出
				if (i % prime[j] == 0) break;           //余数为0说明prime[j]为i的最小质因数,由于
			}
		}

	
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

El.十一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值