PTA乙级题目1007(java+python3+c++)

PTA乙级题目1007(java+python3+c++)

题目信息:
让我们定义d​n​​为:d​n​​=p​n+1​​−p​n​​,其中p​i​​是第i个素数。显然有d​1​​=1,且对于n>1有d​n​​是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。

现给定任意正整数N(<10​5​​),请计算不超过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++的目的是为了测试一下速度的差异性,结果貌似没什么大差异。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嘻嘻哈哈笑呵呵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值