import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class PrimeCouple {
public static void main(String[] args) throws IOException {
/**
* 奇数偶数 分组
* 循环奇数组 找到偶数组中能够奇数匹配的素数伴侣
* 已有伴侣的偶数则让给后来可以重新找到伴侣的
*/
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.valueOf(br.readLine());
String [] lines = br.readLine().split("\\s");
List<Integer> odds = new ArrayList<>(8);
List<Integer> evens = new ArrayList<>(8);
for(String i : lines){
int item = Integer.valueOf(i);
if(item % 2 == 1){
odds.add(item);
}
if(item % 2 == 0){
evens.add(item);
}
}
int count = 0;
int [] matchEvens = new int[evens.size()];
for(int odd : odds){
boolean [] v = new boolean[evens.size()];
if(find(odd,matchEvens,evens,v)){
count++;
}
}
System.out.println(count);
}
static boolean find(int odd,int[] matchEvens,List<Integer> evens,boolean[] v){
//遍历偶数
//去检查当前传入的奇数能否与偶数匹配
for (int i = 0; i < evens.size(); i++){
boolean prime = isPrime(odd + evens.get(i));
if(prime && !v[i]){
v[i] = true;
//如果第i个偶数没有伴侣
//或者第i个偶数原来有伴侣,并且该伴侣能够重新找到伴侣的话(这里有递归调用)
//则奇数x可以设置为第i个偶数的伴侣
//这里采用了匈牙利算法,能让则让
if(matchEvens[i] == 0 || find(matchEvens[i],matchEvens,evens,v)){
matchEvens[i] = odd;
return true;
}
}
}
return false;
}
private static boolean isPrime(int n) {
if(n == 1) return false;
for (int i = 2;i <= (int)Math.sqrt(n); i++){
if(n % i == 0)
return false;
}
return true;
}
}
华为OD机考-素数伴侣-逻辑分析(JAVA 2025B卷)
于 2025-06-22 12:34:31 首次发布