乙级PAT真题1007

1007 素数对猜想 (20分)

素数:除了1和他本身,不会被任何数所除的数就是素数

让我们定义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的满足猜想的素数对的个数。

输入样例: 20
输出样例: 4

这里吐槽一下,Java实在时太慢了,做这种算法题,完全不能和C和C++比,人家几ms就解决了,Java要一两百ms,一不小心就会超时,太难了,我调整这道题的写法,写死我了

代码

在做第一种方法时,我不知道ArrayList中的contain方法,所以在剔除重复的数,我还想了好久,还真有够傻的,有contain这个方法,做起来快多了
我还犯一个比较傻的错误,进行循环的时候.落下了一个等号,最后一个数查不到是不是素数,当时,我还一直在找哪里错了,一直没发现,害!

import java.io.BufferedReader;
        import java.io.InputStreamReader;
        import java.util.ArrayList;
        import java.util.List;

public class C_07 {
    public static void main(String[] args) throws Exception {
        BufferedReader bb = new BufferedReader(new InputStreamReader(System.in));
        int c = 0;
        int b = 0;
        int j = 0;
        List<Integer> num = new ArrayList<>();
        List<Integer> count = new ArrayList<>();
        int n = Integer.parseInt(bb.readLine());
        for (int i = 3; i <= n; i++)//运行时最后一个数要注意,不能遗漏
            for (j = 2; j <i; j++) {
                if (i % j == 0) break;
                else if ((j==i-1) && !num.contains(i))
                    num.add(i);
            }
        for (int k = 0; k < num.size() - 1; k++) {
            if (num.get(k + 1) - num.get(k) == 2) {
                count.add(num.get(k));
                count.add(num.get(k + 1));
            }
        }
        System.out.print(count.size() / 2);
    }
}


第二种方法
第二种方法就是没有数组存储,而是直接判断两个相邻的数是否符合条件,直接输出对数.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class C_07_2 {
    public static void main(String[] args) throws Exception {
        BufferedReader bb = new BufferedReader(new InputStreamReader(System.in));
        int pre = 2;
        int j = 0;
        int count = 0;
        Integer n = Integer.parseInt(bb.readLine());
        for (int i = 3; i <=n; i++) {
            for (j = 2; j <= Math.sqrt(i); j++) {
                if (i % j == 0) break;
            }
            if (j > Math.sqrt(i)) {
                if (i - pre == 2)
                    count++;
                pre=i;
            }
        }
        System.out.println(count);
    }
}


写这道题,我真的要被这个折磨死了,希望自己越来越厉害,这个寒假冲冲冲!!!
最后,这里是新学编程的三岁,大佬们如果有更方便的方法,希望能在评论区告诉我,我会加以改正,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值