华为机试---查找组成一个偶数的最接近的两个素数



题目描述

任意一个偶数(大于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;
    }
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值