题解 | #素数伴侣#。花费时间最多的一道,目前,看了大佬的好久才琢磨透。。

素数伴侣

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

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

public class Main2 { public static void main(String[] args) { //标准输入 Scanner sc = new Scanner(System.in); while (sc.hasNext()) { int size = sc.nextInt(); int[] ints = new int[size]; for (int i = 0; i < size; i++) { int next = sc.nextInt(); ints[i] = next; }

        ArrayList<Integer> j = new ArrayList<>();
        ArrayList<Integer> u = new ArrayList<>();
        for (int i = 0; i < size; i++) {
            if (ints[i] %2 !=0){
                j.add(ints[i]);
            }else {
                u.add(ints[i]);
            }
        }
        int count = 0;
        // 记录偶数对应的伴侣
        int[] bl = new int[u.size()];
        for (int i = 0; i < j.size(); i++) {
            // 记录该轮中的偶数有没有被访问
            boolean[] booleans = new boolean[u.size()];
            if (isOk(j.get(i),u,bl,booleans)){
                count++;
            }
        }
        System.out.println(count);
    }
}

private static boolean isOk(int j, ArrayList<Integer> u, int[] bl, boolean[] booleans) {
    for (int i = 0; i < u.size(); i++) {
        // 是素数且该偶数没有被访问过
        if (isSusu(j + u.get(i)) && !booleans[i]){
            booleans[i] = true;
            // 该位置的偶数没有伴侣,或者他的伴侣能找到新的偶数作为伴侣
            if(bl[i] == 0 || isOk(bl[i],u,bl,booleans)){
                bl[i] = j;
                return true;
            }
        }
    }
    return false;
}

private static boolean isSusu(int i) {
    if(i==1) return false;
    for (int j = 2; j <= (int)Math.sqrt(i); j++) {
        if(i % j == 0){
            return false;
        }
    }
    return true;
}

}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务