Hero素数筛选

素数筛选

题一:计数素数;

在这里插入图片描述

思路:

1.根据题目,要找的小于n的所有素数,并统计他的数量,虽然可以通过for循环从零到n 统计,但是这种方式运算量太大,在数值较低的时候,遍历还算好用,但是当数据过大时,素数之间相隔的数太多了,也就是在这之间有太多不必要的遍历。

2.根据英雄哥的笔记,可以看到采用的解决方案是用空间换时间;根据素数的定义,只有被1和本身所整除的数才能叫素数。那么一个素数的所有的倍数均不为素数,例如 一个素数2,那么在n前的所有偶数,均不是素数,因为他们都是2 的倍数;

3.对于n前的每一个数来说,他们都只有两种状态,是或者不是。那么创建一个最大容量的数组,用来记录n前所有的数的状态;我们先默认每个数都是素数,即

int func03(int n)
{     
	//用于记录素数的个数;
	int count = 0;
	// 创建数组;
     bool num[5000001];
	 memset(num, true, sizeof(num));
	//排除边缘数 0和1 不是素数;
	if (n == 0 || n == 1) return 0;
	num[0] = num[1] = false;
	//从2开始遍历到n;
	for (int i = 2; i <= n; i++)
	{
		if (num[i])//判断是否是素数;由于默认都是素数所以num[2] 是true;
		{
			count++;
			//将除i外的i的所有倍数均置为假
			for (int j = 2; j * i <= n; j++)
			{
				num[j*i] = false;
			}
		}
	}
	return count;
	
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值