素数对猜想(题目作者:陈越 浙江大学)
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N
(<105),请计算不超过N
的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N
。
输出格式:
在一行中输出不超过N
的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
首先什么是素数对?
质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。
我们可以用最基本的遍历方法:
bool primes(int k) { int count=1; for (int i = 2; i <= k; i++) { if (k%i == 0) { ++count; if(count>2) return false; } } return true; }
但是这样每一个数字去除很慢不是吗?
所以k不必被2~k-1之间的每一个整数去除,只需被2~√k之间的每一个整数去除就可以了。如果k不能被2~√k间任一整数整除,k必定是素数。例如判别17是是否为素数,只需使17被2~4之间的每一个整数去除,由于都不能整除,可以判定17是素数。(原因:因为如果k能被2~k-1之间任一整数整除,其二个因子必定有一个小于或等于√k,另一个大于或等于√k。例如16能被2,4,8整除,16=2*8,2小于4,8大于4,16=4*4,4=√16,因此只需判定在2~4之间有无因子即可)
以下给出C++解决方案:
#include <iostream> #include <cmath> using namespace std; bool Primenum(int n) { for (int i = 2; i <=sqrt(n); i++) if (n%i == 0) return false; return true; } int main() { int n,sum=0; int re = 0; int prime[100000] = {0}; cin >> n; for (int i = 1; i <= n; i++) if (Primenum(i)) { prime[sum] = i; sum++; } for (int i = 0; i < sum-1; i++) if (prime[i + 1] - prime[i] == 2) re++; cout << re; return 0; }
内容原创,转载请注明出处