PAT乙级:1007. 素数对猜想 (Java)

PAT乙级:1007. 素数对猜想 (Java)_第1张图片


本题不难,重在理解题意中N的含义。此处N的意思为最大的素数不超过N。我们最平常的思路如下:先将所有的小于N的素数算出,再找相邻差为2的:



import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

            Scanner s=new Scanner(System.in);
            int N=0;
            N=s.nextInt();
            //求素数,并添加到Arraylist之中
            List list_int=new ArrayList();
            for (int i = 1; i <= N; i++) {
                boolean is_prime=true;
                for (int j = 2; j <= Math.sqrt(i); j++) {
                    if (i%j==0) {
                        is_prime=false;
                    }
                }
                if (is_prime) {
                    list_int.add(i);
                }
            }
            //输出
            ListIterator lit=list_int.listIterator();
            int left=lit.next();
            int right=0;
            int count=0;
            while (lit.hasNext()) {
                right=lit.next();
                if (right-left==2) {
                    count++;
                }
                left=right;
            }
            System.out.println(count);
    }

}

当然,我们发现此题目有一个特点:不断比较相邻的素数相差是否为 2 。比较相邻几项的题目一般都可以用几个变量来搞定而不用数组,但会增加一点时间上的开销。



import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

            Scanner s=new Scanner(System.in);
            int N=0;
            N=s.nextInt();

            int left=-1;//相邻两个数左边的数
            int right=-1;//相邻两个数右边的数
            int count=0;//记录所有满足条件的次数

            for (int i = 2; i <= N; i++) {
                boolean is_prime=true;
                for (int j = 2; j <= Math.sqrt(i); j++) {
                    if (i%j==0) {
                        is_prime=false;
                    }
                }
                if (is_prime) {//如果这个数是素数
                    if (left==-1) {//当左面比较的数还没有时,初始化左面的数
                        left=i;
                    }else if (right==-1) {//当右面的数为空时
                        right=i;
                        if (right-left==2) {//比较相差是否为2
                            count++;
                        }else{

                        }
                        //无论是否符合相差为2,都将右部置空
                        left=right;
                        right=-1;
                    }
                }
            }
            System.out.println(count);
    }

}

你可能感兴趣的:(Algorithm)