让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数。显然有 d1=1 且对于n>1有 dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N (< 105),请计算不超过N的满足猜想的素数对的个数。
输入格式:每个测试输入包含1个测试用例,给出正整数N。
输出格式:每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。
输入样例:20输出样例:
4
这道题我提交了很多次,每次都是最后一个测试点不能通过,借鉴了网上一位老哥的素数算法,虽然比普通算法快了很多,但是还是无法通过。最后让同学用c++写出的普通算法轻松通过所有测试点,用时基本是0ms,感叹c和python的速度差距,之前学校开的c++课没学好,看来要重新学一遍c和c++。
这是普通算法:
n = int(input())
lis = []
for i in range(2,n+1):#判断n个数中素数个数
if i == 2:#2是素数
lis.append(i)
elif i == 3:#3是素数
lis.append(i)
elif i%2 != 0:#除2外,所有偶数不是素数
x = 0
for a in range(2,int(i**0.5)+1):#在2到根号X的区间内,如果任意一数能被X整除,X必不是素数
if i%a == 0:
continue
else:
x = x+1
if x == int(i**0.5)-1:
lis.append(i)
a = 0
for i in lis:
if i+2 in lis:
a = a+1
print(a)
这是借用了网上一位老哥的算法:
def get(num):#加强版素数算法
if num == 2 or num == 3:
return True
if num%6 != 1 and num%6 != 5:
return False
tps = int(num**0.5)
for i in range(5,tps+1,6):
if num%i == 0 or num%(i+2) == 0:
return False
return True
n = int(input())
lis = []
for i in range(2,n+1):
if get(i):
lis.append(i)
a = 0
for i in lis:
if i+2 in lis:
a = a+1
print(a)
最后,这是模仿同学写的c++:
#include<stdio.h>
#include<math.h>
#include<iostream>
using namespace std;
bool sushu(int number)
{
if (number == 2 || number == 3)
{
return true;
}
if (number %6 != 1 && number %6 != 5)
{
return false;
}
int temp = sqrt(number);
for (int i = 5; i<= temp; i += 6)
{
if (number %i == 0 || number %(i+2) == 0)
{
return false;
}
}
return true;
}
int main()
{
int n;
cin>>n;
int counter = 0;
for (int i = 2; i <= n; ++i)
{
if (sushu(i))
{
if (sushu(i+2) && i+2 <= n)
{
counter = counter + 1;
}
}
}
printf("%d",counter);
return 0;
}
2018.2.18补充:
对这题有新的想法,用python提交后发现能通过最后一个测试点了。最后一个点用时183ms。
这次的想法:
判断为素数后,将素数插入list中,设定一个counter来标记素数的序号,然后通过序号作为index,判断任意两个相邻的素数之差是否为2,再设定一个counter2来统计个数,最后输出counter2。
之前的做法是判断为素数后,插进list中,再用一个for循环遍历这个list,用if语句判断符合条件的素数对个数。这样把判断素数和判断素数对拆分成两部分计算,并且用多次for循环遍历,时间复杂度较高,新的方法避免了拆分,少用了for循环,直接在一个循环中完成了所有的判断,用时更短。
def get(num):#加强版素数算法
if num == 2 or num == 3:
return True
if num%6 != 1 and num%6 != 5:
return False
tps = int(num**0.5)
for i in range(5,tps+1,6):
if num%i == 0 or num%(i+2) == 0:
return False
return True
n = int(input())
lis = []
counter = 0
counter2 = 0
for i in range(2,n+1):
if get(i):
lis.append(i)
counter = counter + 1
if lis[counter-1]-lis[counter-2] == 2:
counter2 = counter2 + 1
print(counter2)