PTA乙级题目1007(java+python3+c++)
题目信息:
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N(<105),请计算不超过N的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N。
输出格式:
在一行中输出不超过N的满足猜想的素数对的个数。
想法:
解题时一开始循规蹈矩,for里套for,结果运行超时,后来网上查了查,发现计算素数(质数)时可以先将这个数开方计算结果是相同的,后来有根据题意,要求两个数相邻且差为2,所以算是不是质数的时候直接以2为区间递增。
代码:
c++
#include <iostream>
//不要忘了导入数学模块
#include <cmath>
using namespace std;
//c++写,要用整型并且返回0
int main()
{
//输入数字
int a;
cin>>a;
//各个标志位
int c = 0, d = 0, e = 0, z = 0, f = 0;
//具体进行
//从3开始(1和2已经是而且2和3的差不等于2,直接忽略掉,并且直接以2递增)
for(int i = 3; i <= a; i = i + 2)
{
//质数标记位
d = 0;
//判断是不是质数(将数开方)
for(int j = 2; j <= sqrt(i); j++)
{
//只要有一个能除开就不是质数
if(i % j == 0)
{
//标志位置1(表明不是质数)
d = 1;
break;
}
}
//c标志位代表顺序(等于0表示这是这组的第二个数,等于2表示这是这组的第一个数)
if(c == 0 && d != 1)
{
//f存储第二个数
f = i;
c = 2;
//两数相减
if(f - e == 2)
{
//结果组数+1
z++;
}
}
else if(c == 2 && d != 1)
{
//e用来存储第一个数
e = i;
c = 0;
//两数相减
if(e - f == 2)
{
//结果组数+1
z++;
}
}
}
//输出结果
cout<<z;
//调试时使用(暂停)【可注释】
system("pause");
return 0;
}
java
import java.util.Scanner;
//导入数学
import java.lang.Math.sqrt;
//导入数组
import java.util.ArrayList;
//与c++写法大体一致
public class Main
{
public static void main(String[] args)
{
//输入
Scanner ll = new Scanner(System.in);
int a = ll.nextInt();
ArrayList<Integer> aa = new ArrayList<>();
//判断并将质数整合为一个数组
for(int i = 3; i <= a; i++)
{
int zz = 0;
for(int j = 2; j <= sqrt(i); j++)
{
int z = i / j;
if(z * j == i)
{
zz ++;
}
}
if(zz == 0)
{
aa.add(i);
}
}
//结果
int result = 0;
//遍历数组计算差额
for(int i = 1; i < aa.size(); i++)
{
if(aa.get(i) - aa.get(i - 1) == 2)
{
result += 1;
}
}
//输出结果
System.out.println(result);
}
}
python3
# 与c++大体一致
# 输入
x = int(input())
# 各标志位,与c++对应
z = 0
d = 0
e = 0
f = 0
c = 0
# 其余内容一样
for i in range(3, x + 1, 2):
d = 0
for j in range(2, int(pow(i, 0.5) + 1)):
if i % j == 0:
d = 1
break
if c == 0 and d != 1:
f = i
c = 2
if f - e == 2:
z +=1
continue
if c == 2 and d != 1:
e = i
c = 0
if e - f == 2:
z +=1
//输出结果
print(z)
总结
一开始的时候先用的python写的,用的最普通的方法,结果好几个超时,以为python的问题就换成了java,结果最后一个超时了,然后上网查了查,发现了计算质数开方这个原因,结果一换3便都能通过。写c++的目的是为了测试一下速度的差异性,结果貌似没什么大差异。