day15 HJ60 查找组成一个偶数最接近的两个素数(Java)

250 阅读3分钟

题目来源: HJ60 查找组成一个偶数最接近的两个素数

题目描述:

  • 描述: 任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个素数差值最小的素数对。
    数据范围: 输入的数据满足 4n10004≤n≤1000
  • 输入描述: 输入一个大于2的偶数
  • 输出描述: 从小到大输出两个素数
示例1:
输入:20
输出:7 
     13
输入:4
输出:2
     2

思路

素数(也说质数),数学上指在大于1的整数中只能被1和它本身整除的数。找一个数N之内,是否有素数,可以反其道行之,只需要反向找到是否有约数,没有约数就是素数(如果一个数字不是素数,那它除了1和他本身一定还有别的约数)

具体实现:

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        int[] ints = new int[N - 1];  //首先排除,1不是素数,其实没啥意义,用N也行,
        //找一个数N之内,是否有素数,只需要反向找到是否有约数,没有约数就是素数
        int sum = 0;
        for (int i = 2, j = 0; i < N; i ++) {
            if (!Prime_number(i)) {  //判断是不是素数
                ints[j] = i;
                j++;
            }
            sum = j;
        }

        int[] ints2 = new int[N];
        int k = 0;
        for(int i = 0;i < sum;i++){
            for(int j = i;j<sum;j++){
                if(ints[i]+ints[j] == N){  //判断素数是否相加的和等于N
                    ints2[k++] = ints[i];
                    ints2[k++] = ints[j];
                }
            }
        }

        int temp = Integer.MAX_VALUE;
        int[] arr = new int[2];
        for(int i =0;i<k;i += 2){
            if(Math.abs(ints2[i+1]-ints2[i]) < temp){  //将素数差值最小的素数筛选出来
                arr[0] = ints2[i];
                arr[1] = ints2[i+1];
                temp = Math.abs(ints2[i+1]-ints2[i]);
            }
        }
        System.out.println(arr[0]+"\n"+arr[1]);
    }

    static Boolean Prime_number(int number){    //用求约数的方法,反向判断是不是素数
        for(int i = 2;i <= Math.sqrt(number); i ++){
            if(number % i == 0){   //有约数,则不是素数
                return true;
            }
        }
        return false;   //没有约数,则不是素数
    }
}

思路杂记

1.上述思路是先将一个数N之内的所有素数求出来,对于这些素数进行筛选,筛选出满足相加后等于N的素数对,然后将每个素数对进行求差值,对于差值进行比较,将素数差值最小的筛选出来。

2.其实,对于上述思路,还有另外的实现方法,不用专门将素数求出来,而是直接将数N之内的数成对的进行判断,即将i与N-i进行判断,是否都是素数,这样就直接得到了既是素数又是满足相加为N的素数对,一举两得

import java.util.Scanner;

public class day15_2 {
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        int min = Integer.MAX_VALUE;
        int[] result = new int[2];
        for (int i = 2, j = 0; i < N; i ++) {
            //思路2的重要体现
            if (Prime_number(i) && Prime_number(N - i)) {  //直接判断出满足的素数对
                if(Math.abs(N - i - i) < min){   //筛选出差值最小的素数对
                    result[0] = i;
                    result[1] = N - i;
                    min = Math.abs(N-i - i);
                }
            }
        }
        System.out.println(result[0]+"\n"+result[1]);
    }

    static Boolean Prime_number(int number){   //判断是否是素数
        for(int i = 2;i <= Math.sqrt(number); i ++){
            if(number % i == 0){
                return false;
            }
        }
        return true;
    }
}