题目 素数对猜想
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N(<105),请计算不超过N的满足猜想的素数对的个数。
输入格式
输入在一行给出正整数N。
输出格式
在一行中输出不超过N的满足猜想的素数对的个数。
输入样例
20
输出样例
4
代码
直接两个循环,外面循环遍历并判断差是否为2,内部循环判断这个数是否是素数。
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
int max;
cin >> max;
int prev = 3,num = 0;
for (int i = 2; i < max+1; i++)
{
bool tag = true;
for (int j = 2; j < sqrt(i) + 1; j++)
{
if (i%j == 0)
{
tag = false;
break;
}
}
if (tag)
{
if (i - prev == 2)
num = num + 1;
prev = i;
}
}
cout << num;
}
用Python写这样会超时,需要对遍历循环算法进行改进。
已经通过了的实现方式是当这个数除以6还余1或5时再开始对这个数进行是否是素数的循环判断。
附Python代码:
from math import sqrt
def primePair(n):
p = 0
temp = 3
for i in range(5,n+1,2):
if (i%6==1 or i%6 == 5):
for j in range(3,int(sqrt(i))+1,2):
if (i%j == 0):
break
else:
if (i-temp == 2):
p = p+1
temp = i
print(p)
n = eval(input())
primePair(n)