题目:
用筛法求之N内的素数。
输入:
N
输出:
0~N之间的素数:
样例输入:
50
样例输出:
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
解题思路:
什么是筛选法:基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空时结束。
用一个数组来记录1~N之间的数;在用一个数组记录:1~N之间是素数的,值为1,否则为0;根据题目初始化全部为1,再来进行筛选:
代码:
#include<iostream>
#include<cmath>
using namespace std;
#define N 10001
bool isPrime(int num)//判断素数
{
int tmp = sqrt(num);
for (int i = 2; i <= tmp; i++)
if (num %i == 0)
return 0;
return 1;
}
int main()
{
int n;
cin >> n;
int a[N], b[N];//a[]用来记录0~N之间的值,b[]记录1~n之间是素数的值为1,否则为0
int i;
a[1] = 0;//把1,和 n 去掉
a[n] = 0;
for (i = 2; i <n; i++)
a[i] = 1;//根据题目,先不所以的设置为1
for (i = 1; i <=n; i++)
b[i] = i ;
for (i = 2; i <=n; i++) {
if (isPrime(i)) {
for(int j=i+1;j<n;j++)//i是素数,把i~n之间的是i的倍数的数去掉,即对应位置设置为0
if(j%i==0&&a[i] != 0)
a[b[j]] = 0;
}
}
for (i = 1; i <=n; i++)//根据条件,打印出来
if (a[i] == 1)
cout << b[i] << endl;
return 0;
}