题目描述
任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个素数差值最小的素数对
输入描述:
输入一个偶数
输出描述:
输出两个素数
输入例子:
20
输出例子:
7 13
方法一:从mid开始找,耗时短
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner scan = new Scanner(System.in); while(scan.hasNext()){ int n = scan.nextInt(); int[] result = searchNearPrime(n); System.out.println(result[0] + "\n" + result[1]); } scan.close(); } private static int[] searchNearPrime(int n){ //输入的是偶数,从中间开始找的话就是保证两个数差距最小,再分别判断两个数是不是质数 int[] result = new int[2]; //寻找最小差值 int mid = n / 2; //外层从mid开始减小,内层从mid开始增加,一旦找到,一定是差距最小 for(int i = mid ; i >= 2 ; i--){ for(int j = mid ; j < n ; j++){ if(isPrime(i) && isPrime(j)){ if(i + j == n){ result[0] = i; result[1] = j; return result; } //如果i+j已经大于n,不用再递增j,继续下一次循环 if(i + j > n) break; } } } return result; } private static boolean isPrime(int n){ if(n < 2) return false; for(int i = 2 ; i <= Math.sqrt(n) ; i++){ if(n % i == 0){ return false; } } return true; } }
方法二:找到小于N的所有的素数寻找最小距离
import java.util.Scanner; import java.util.ArrayList; import java.util.List; public class Main{ public static void main(String[] args){ Scanner scan = new Scanner(System.in); while(scan.hasNext()){ int n = scan.nextInt(); searchNearPrime(n); } scan.close(); } private static void searchNearPrime(int n){ List<Integer> list = new ArrayList<Integer>(); //n是偶数,找到小于n的所有素数 for(int i = 2 ; i < n ; i++){ if(isPrime(i)){ list.add(i); } } //寻找最小差值 int size = list.size(); int min_distance = Integer.MAX_VALUE; int little = 0; int big = 0; for(int i = 0 ; i < size - 1 ; i++){ for(int j = i ; j < size ; j++){ if(list.get(i) + list.get(j) == n && list.get(j) - list.get(i) < min_distance){ little = list.get(i); big = list.get(j); } } }//endfor System.out.println(little + "\n" + big); } private static boolean isPrime(int n){ if(n < 2) return false; for(int i = 2 ; i <= Math.sqrt(n) ; i++){ if(n % i == 0){ return false; } } return true; } }