题解 | #素数伴侣#

素数伴侣

https://www.nowcoder.com/practice/b9eae162e02f4f928eac37d7699b352e

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
       Scanner scanner = new Scanner(System.in);
        int i = scanner.nextInt();
        int[] ints = new int[i];
        ArrayList<Integer> odd = new ArrayList<>();
        ArrayList<Integer> even = new ArrayList<>();
        for (int j = 0; j <i; j++) {
            ints[j]=scanner.nextInt();
            if (ints[j]%2==0){
                even.add(ints[j]);
            }else {
                odd.add(ints[j]);
            }
        }
        int[] match = new int[even.size()];//下标对应已经匹配的偶数的下标,值对应这个偶数的伴侣
        int count=0;
        for (int j = 0; j < odd.size(); j++) {
            boolean[] ifpped= new boolean[even.size()];//标记对应该奇数是否匹配过每一个偶数
            if(success(odd.get(j),even,match,ifpped)){
                count++;
            }
        }
        System.out.println(count);
    }
    public static boolean success(int odd,ArrayList<Integer> even,int[] match,boolean[] ifpped){
        for (int i = 0; i < even.size(); i++) {
            if (isPrime(odd+even.get(i))&&ifpped[i]==false){
                ifpped[i]=true;
                if(match[i]==0||success(match[i],even, match,ifpped)){//如果当前偶数没有伴侣或偶数有的奇数伴侣可以找到其他偶数伴侣
                    match[i]=odd;
                    return true;
                }
            }
        }
        return false;
    }
    public static boolean isPrime(int n) {
        if (n <= 3) {
            return n > 1;
        }
        //判断一个数能否被小于sqrt(n)的数整除
        int sqrt = (int)Math.sqrt(n);
        for (int i = 2; i <= sqrt; i++) {
            if(n % i == 0) {
                return false;
            }
        }
        return true;
    }
}

全部评论

相关推荐

牛客868257804号:九个中铁八个中建
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务