用筛选法求素数
2018-02-05 21:39
211 查看
题目:
用筛法求之N内的素数。
输入:
N
输出:
0~N之间的素数:
样例输入:
50
样例输出:
解题思路:
什么是筛选法:基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列,
1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空时结束。
用一个数组来记录1~N之间的数;在用一个数组记录:1~N之间是素数的,值为1,否则为0;根据题目初始化全部为1,再来进行筛选:
代码:
用筛法求之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; }
相关文章推荐
- 数学-筛选素数
- 素数筛选(转载)
- c语言筛选法求素数
- 算法之――素数之筛选法
- Java之用厄拉多塞筛选法求n以内的所有素数
- 筛选法求素数_2
- 素数的筛选找法
- 我的素数筛选法
- NUC1931 Problem D 区间素数【素数筛选】
- UVa 1644 - Prime Gap(筛选求素数)
- F - Prime Path POJ 3126 筛选素数+bfs
- UVALive3399 UVA1210 POJ2739 Sum of Consecutive Prime Numbers【素数筛选+尺取法】
- LightOj 1197 Help Hanzo (区间素数筛选)
- 用筛选法求出100以内的素数
- 用Go的风格实现素数筛选
- codeforces Soldier and Number Game(dp+素数筛选)
- Go语言实现的素数筛选程序
- 大区间素数筛选 POJ2689
- Goldbach`s Conjecture 素数筛选
- Light oj-1370(素数筛选)