质数问题(蓝桥杯)

质数问题

朴素筛

筛掉所有数(素数和合数都有参与最外层循环)的倍数,for循环不在if语句里

int tot = 1;//质数个数
for(int i = 2; i <= n; i++)//2到n循环
{
    if(!check[i])
    {
        prime[tot++] = i;//当前数为质数,存入prime[]数组
                         //tot加一,质数个数加一
    }
    for(int j = i + i; j <= n; j += i)
    {
        check[j] = 1;//标记合数
    }
}

埃氏筛

  • 基本思想:一次循环筛掉当前素数的倍数
  • 缺点:存在重复筛选,比如6既可以被2筛掉,又可以被3筛掉
int tot = 1;//质数个数
for(int i = 2; i <= n; i++)//2到n循环
{
    if(!check[i])//筛掉已经被质数倍数标记过的合数,避免让合数进入循环
    {
        prime[tot++] = i;//当前数为质数,存入prime[]数组
                         //tot加一,质数个数加一
        for(int j = i + i; j <= n; j += i)
    	{
        	check[j] = 1;//标记合数
    	}
    }
}

线性筛

  • 中心思想:只能被最小质因子筛掉
void get_primes(int n)
{
	for(int i = 2; i <= n; i ++)
	{
		if(!st[i]) primes[cnt ++] = i;//若当前i未被标记过,仍为0,筛选入primes数组
                                      //当前cnt为素数个数
		for(int j = 0; j < cnt && primes[j] * i <= n; j ++)//下面将利用primes[j]*i寻找合数,现在给其设定条件
		{
			st[primes[j] * i] = true;//找到的合数标记为1
			if(i % primes[j] == 0) break;//当前数/(遍历找到)最小质因数,最差情况i为素数遍历最后为primes[cnt - 1] = i
		}
	}
 } 
循环次数当前被判断的数iprime[]素数的计数数组此次循环筛掉的合数prime[j] * i
第一次2[2]4
第二次3[2,3]6,9
第三次4[2,3]8
第四次5[2,3,5]10,15,25
第五次6[2,3,5]12
第六次7[2,3,5,7]14,21,35,49
第七次8[2,3,5,7]16
第九次9[2,3,5,7]18,27
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值