王道计算机机试——巧妙求素数 素数筛法
题目描述:
输入一个整数 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