王道计算机机试——巧妙求素数 素数筛法

王道计算机机试——巧妙求素数 素数筛法

题目描述:

输入一个整数 n(2<=n<=10000),要求输出所有从 1 到这个整数之间 (不包括 1 和这个整数 )个位为 1 的素数,如果没有则输出 -1。
输入: 输入有多组数据。 每组一行,输入 n。
输出: 输出所有从 1 到这个整数之间 (不包括 1 和这个整数 )个位为 1 的素数 (素数之 间用空格隔开,最后一个素数后面没有空格 ),如果没有则输出 -1。
样例输入:
100
样例输出:
11 31 41 61 71
来源: 2008 年北京航空航天大学计算机研究生机试真题

巧妙求素数思路

若一个数不是素数,则必存在一个小于它的素数为其的因数。这个命题的正确性是显而易见的。那么,假如我们已经获得了 小于一个数的所有素数,我们只需确定该数不能被这些素数整除,这个数即为素 数。但是这样的做法似乎依然需要大量的枚举测试工作。
正因为如此,我们可以换一个角度,在我们获得一个素数时,即将它的所有倍数均标记成非素数,这样当我们遍历到一个数时,它没有被任何小于它的素数标记为非素数,则我们确定其为素数。

解题步骤

我们按照如下步骤完成工作:
从 2 开始遍历 2 到 1000000 的所有整数,若当前整数没有因为它是某个小于 其的素数的倍数而被标记成非素数,则判定其为素数,并标记它所有的倍数为非 素数。然后继续遍历下一个数,直到遍历完 2 到 1000000 区间内所有的整数。此 时,所有没被标记成非素数的数字即为我们要求的素数。这种算法被我们称为素 数筛法。

代码

#include<iostream>
using namespace std;
int prime[10000];//保存筛得的素数
int primeSize;//保存素数的个数
bool mark[10001
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值