POJ-2689-Prime Distance
2016-06-30 23:18
381 查看
ACM模版
题目链接
POJ 2689 Prime Distance题解
素数排查问题,问题的关键在于如何找出给定区间中的所有素数,涉及到一个预处理。代码
#include <iostream> using namespace std; const int MAXN = 100010; int prime[MAXN + 1]; // 预处理 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; } } } } bool notPrime[1000010]; int primes[1000010]; void getPrimes(int L, int R) { memset(notPrime, false, sizeof(notPrime)); if (L < 2) { L = 2; } for (int i = 1; i <= prime[0] && (long long)prime[i] * prime[i] <= R; i++) { int s = L / prime[i] + (L % prime[i] > 0); if (s == 1) { s = 2; } for (int j = s; (long long)j * prime[i] <= R; j++) { if ((long long)j * prime[i] >= L) { notPrime[j * prime[i] - L] = true; } } } primes[0] = 0; for (int i = 0; i <= R - L; i++) { if (!notPrime[i]) { primes[++primes[0]] = i + L; } } } int main(int argc, const char * argv[]) { // 预处理 getPrime(); int L, U; while (cin >> L >> U) { getPrimes(L, U); if (primes[0] < 2) // 素数数量不够成对 { cout << "There are no adjacent primes.\n"; } else { int xOne = 0, xTwo = 100000000, yOne = 0, yTwo = 0; for (int i = 1; i < primes[0]; i++) { if (primes[i + 1] - primes[i] < xTwo - xOne) // 排查最近的素数对 { xOne = primes[i]; xTwo = primes[i + 1]; } if (primes[i + 1] - primes[i] > yTwo - yOne) // 排查最远的素数对 { yOne = primes[i]; yTwo = primes[i + 1]; } } cout << xOne << ',' << xTwo << "are closest," << yOne << ',' << yTwo << "are most distant.\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)