您的位置:首页 > 其它

用筛选法求素数

2018-02-05 21:39 211 查看
题目:

用筛法求之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
, b
;//a[]用来记录0~N之间的值,b[]记录1~n之间是素数的值为1,否则为0
int i;

a[1] = 0;//把1,和 n 去掉
a
= 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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  筛选法 求素数