华为机试牛客刷题之HJ60 查找组成一个偶数最接近的两个素数

HJ60 查找组成一个偶数最接近的两个素数

描述
对于给定的偶数 n,找出两个素数 a,b,满足:

  • 它们的和等于 n;
  • 它们的差值的绝对值最小。

我们可以证明,a,b 一定存在,从小到大输出满足条件的素数对。

输入描述:
输入一个整数 n(4≦n≦10^3 )。保证 n 是偶数。

输出描述:
第一行输出一个整数 a,代表满足条件的素数对中的较小者。
第二行输出一个整数 b,代表满足条件的素数对中的较大者。

示例1

输入: 20
输出: 7
      13

示例2

输入: 4
输出: 2

思路是先通过 for 循环检查 n 是否能被 2 到 sqrt(n) 范围内的数整除。寻找小于 k 的所有素数。然后使用双指针法寻找和为 k 的素数对,并且选择差值最小的那一对素数。

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

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int k = in.nextInt();
            List<Integer> list = new ArrayList<Integer>();
            int n = 2;

            while (n < k) {
                boolean flag = true;
                for (int i = 2; i <= Math.sqrt(n); i++) {
                    if (n % i == 0 && i != n) {
                        flag = false;
                        break;
                    }
                }
                if (flag) {
                    list.add(n);
                }
                n++;
            }

            int left = 0;
            int right = list.size() - 1;
            int mindiff = Integer.MAX_VALUE;
            int small = 0;
            int big = 0;
            int temp = 0;
            int diff = 0;
            int[] result = new int[2];
            while (left <= right) {
                small = list.get(left);
                big = list.get(right);
                temp = small + big;
                if (temp > k) {
                    right--;
                }
                else if (temp < k) {
                    left++;
                }
                else if (temp == k) {
                    diff = big-small;
                    if(diff < mindiff){
                        mindiff = diff;
                        result[0] = small;
                        result[1] = big;
                    }
                    left++;
                    right--;
                }
            }

            System.out.println(result[0]);
            System.out.println(result[1]);
        }
    }
}

你可能感兴趣的:(算法,华为,算法,java)