【华为OJ】【051-查找组成一个偶数最接近的两个素数】

来源:互联网 发布:个人求职网站方案域名 编辑:程序博客网 时间:2024/06/05 07:26

【华为OJ】【算法总篇章】


【华为OJ】【051-查找组成一个偶数最接近的两个素数】

【工程下载】


题目描述

任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个素数差值最小的素数对

输入描述

输入一个偶数

输出描述

输出两个素数

输入例子

20

输出例子

713

算法实现

import java.util.Scanner;/** * Author: 王俊超 * Date: 2015-12-25 09:52 * Declaration: All Rights Reserved !!! */public class Main {    public static void main(String[] args) {        //Scanner scanner = new Scanner(System.in);        Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt"));        while (scanner.hasNext()) {            int n = scanner.nextInt();            System.out.println(findPrimeNumber(n));        }        scanner.close();    }    private static String findPrimeNumber(int n) {        int[] a = new int[4];        int i = n - 1;        int idx = 0;        // 找小于的n的两个质数,有可能只找到一个        while (i >= 2 && idx < 2) {            if (isPrime(i)) {                // 保证小的在前,大的在后                a[1 - idx] = i;                idx++;            }            i--;        }        i = n + 1;        // 说明在n之前有两个最接近n的质数,那就可只要在[n+1, n]之间再找两个质数,有可能没有两个        if (idx == 2) {            while (i <= 2 * n && idx < 4) {                if (isPrime(i)) {                    a[idx] = i;                    idx++;                }                i++;            }            // [n+1, n]无质数            if (idx == 2) {                return a[0] + " " + a[1];            }            // [n+1, n]只有一个质数            else if (idx == 3) {                // a[2]离n的距离比前两个远                if (n - a[0] <= a[2] - n) {                    return a[0] + " " + a[1];                } else {                    return a[1] + " " + a[2];                }            }            // [n+1, n]有两个质数            else {                // 取左边两个                if (n - a[0] <= a[2] - n) {                    return a[0] + " " + a[1];                }                // 取右边两个                else if (n - a[1] >= a[3] - n) {                    return a[2] + " " + a[3];                }                // 取中间两个                else {                    return a[1] + " " + a[2];                }            }        }        // 在[2, n-1]之间只有一个质数或者没有        else {            while (i <= Integer.MAX_VALUE && idx < 2) {                if (isPrime(i)) {                    a[idx] = i;                    idx++;                }                i++;            }            return a[0] + " " + a[1];        }    }    private static boolean isPrime(int n) {        if (n < 2) {            return false;        }        int sqrt = (int) Math.sqrt(n);        for (int i = 2; i <= sqrt; i++) {            if (n % i == 0) {                return false;            }        }        return true;    }}
2 0