51Nod-1181-质数中的质数(质数筛法)
2016-07-26 18:10
316 查看
ACM模版
Input
输入一个数N(N <= 10^6)
Output
输出>=N的最小的质数中的质数。
Input示例
20
Output示例
31
描述
如果一个质数,在质数列表中的编号也是质数,那么就称之为质数中的质数。例如:3 5分别是排第2和第3的质数,所以他们是质数中的质数。现在给出一个数N,求>=N的最小的质数中的质数是多少(可以考虑用质数筛法来做)。Input
输入一个数N(N <= 10^6)
Output
输出>=N的最小的质数中的质数。
Input示例
20
Output示例
31
题解
根据题上提示,这里需要用到质数的筛选。首先,筛选出小于MAXN的所有素数,当然MAXN要比N的最大值大很多。然后查找刚好大于等于N的素数,记下下标flag,然后重新查找刚好大于等于
flag的素数,那么
prime[prime[flag]]就是所要求的最后结果。
代码
#include <iostream> #include <cstring> using namespace std; /* * 素数筛选,查找出小于等于MAXN的素数 * prime[0]存素数的个数 */ const int MAXN = 10000000; int prime[MAXN]; void getPrime() { memset(prime, 0, sizeof(prime)); for (int i = 2; i <= MAXN; i++) { if (!prime[i]) { prime[++prime[0]] = i; } for (int j = 1; j <= prime[0] && prime[j] <= MAXN / i; j++) { prime[prime[j] * i] = 1; if (i % prime[j] == 0) { break; } } } } int main(int argc, const char * argv[]) { int N; getPrime(); while (cin >> N) { int flag = 0; for (int i = 1; i <= N; i++) { if (prime[i] >= N) { flag = i; break; } } for (int i = 1; i <= flag; i++) { if (prime[i] >= flag) { flag = i; break; } } cout << prime[prime[flag]] << '\n'; } return 0; }
参考
《素数相关》相关文章推荐
- C#查找素数实现方法
- java使用筛选法求n以内的素数示例(java求素数)
- java求100以内的素数示例分享
- 判断一个数是不是素数的方法
- C++回文数及素数问题计算方法
- c#求范围内素数的示例分享(c#求素数)
- GO语言求100以内的素数
- Java列出2到100之间所有素数的方法
- Python素数检测实例分析
- Python实现高效求解素数代码实例
- 使用Python判断质数(素数)的简单方法讲解
- Python素数检测的方法
- Python实现求最大公约数及判断素数的方法
- Go语言生成素数的方法
- python学习--埃拉托斯特尼筛法求素数
- 使用Python判断质数(素数)的简单方法讲解
- 【python】编程语言入门经典100例--12
- Python-求素数程序
- 【HDU 2136】Largest prime factor 详细图解
- 数论算法初步理解(1)