我们来看看今天的pat题目:
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N
(<105),请计算不超过N
的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N
。
输出格式:
在一行中输出不超过N
的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
可以看出: 题目的意思是,输入一个正整数n,求在1~n之间,相邻的素数的差为2,总共有几对。既然了解了题目的意思,那我们就知道该怎么做了:首先,是要知道1~n之间有那些数是素数,再看看那些相邻的素数差为2,然后统计下来。
因为我的python代码有点小问题,所有先看看java版
Java:
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int num=sc.nextInt();
ArrayList<Integer> list=new ArrayList<>();
for(int i=3;i<=num;i++) {//开始判断从3到num之中那些是素数
boolean judged=true;//开始假设i是素数
for(int j=2;j<=Math.sqrt(i);j++) {//减少运算时间
if(i%j==0) {
judged=false;
break;
}
}
if(judged) {
list.add(i);//把素数加到列表里面
}
}
int number=0;
for(int i=0;i<list.size()-1;i++) {
if(list.get(i+1)-list.get(i)==2) {//看看相邻两个数是不是素数对,统计
number++;
}
}
System.out.println(number);
}
}
再来看看python版,大家看看有什么问题
python:
import math
n=int(input())
list1=[]
i=3
while i<=n:
judeged=True
j=2
while j <=int(math.sqrt(i)):
if i%j==0:
judeged=False
break
j+=1
if judeged:
list1.append(i)
i+=1
num=0
for i in range(len(list1)-1):
if list1[i+1]-list1[i]==2:
num+=1
print(num)
乍一看是不是没有错误,对的,这个代码没有错,错的是这个世界(⓿_⓿),其实这个代码在pat上是有问题的,因为python写完程序,要提交到解释器上面去,解释器再进行翻译成机械语言。python为啥这么慢,很简单,它不知道数据类型,要先判断一下,java和c++都是先定义了的。
所有这次就java版能满分通过,python最后一项超时了,大家有好的python版可以给我说说