题目描述
题目描述
若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如2和5、6和13,它们能应用于通信加密。现在密码学会请你设计一个程序,从已有的 N ( N 为偶数)个正整数中挑选出若干对组成“素数伴侣”,挑选方案多种多样,例如有4个正整数:2,5,6,13,如果将5和6分为一组中只能得到一组“素数伴侣”,而将2和5、6和13编组将得到两组“素数伴侣”,能组成“素数伴侣”最多的方案称为“最佳方案”,当然密码学会希望你寻找出“最佳方案”。
输入:
有一个正偶数 n ,表示待挑选的自然数的个数。后面给出 n 个具体的数字。
输出:
输出一个整数 K ,表示你求得的“最佳方案”组成“素数伴侣”的对数。
数据范围:
1
≤
n
≤
100
1≤n≤100
1≤n≤100 ,输入的数据大小满足
2
≤
v
a
l
≤
30000
2≤val≤30000
2≤val≤30000
输入描述:
输入说明
1 输入一个正偶数 n
2 输入 n 个整数
输出描述:
求得的“最佳方案”组成“素数伴侣”的对数。
示例1
输入:4
2 5 6 13
输出:2
示例2
输入:2
3 6
输出:0
题解
下面展示本人题解思路代码。
/*
素数(又称质数)是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
素数的一条性质:除2以外,所有素数都是奇数。素数可以拆分为偶数+基数
*/
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
// 构造二维数组,若值为1则表示这对数为素数伴侣
let result = new Array(100).fill(0).map(() => new Array(100).fill(0));
//匈牙利算法
let oddX = new Array(100).fill(-1);
let evenX = new Array(100).fill(-1);
// 记录该数有没有被判断过
let flagX = new Array(100).fill(0);
// 判断是否是素数
function isPrimeNumber(number) {
let flag = 0;
for (let i = 2; i <= number / i; i++) {
if (number % i == 0) {
flag = 1;
continue;
}
}
if (flag == 0) {
return true;
}
return false;
}
function dfs(i) {
//找到返回1 没找到返回0
for (let j = 0; j < 100; j++) {
if (result[i][j] == 1 && !flagX[j]) {
// ij匹配
flagX[j] = 1;
if (evenX[j] == -1 || dfs(evenX[j])) {
oddX[i] = j;
evenX[j] = i;
return 1;
}
}
}
return 0;
}
void (async function () {
let num = Number(await readline());
let arr = (await readline()).split(" ");
let even = [];
let odd = [];
//进行奇偶分类
for (let i = 0; i < num; i++) {
if (arr[i] % 2 != 0) {
odd.push(arr[i]);
} else {
even.push(arr[i]);
}
}
for (let i = 0; i < odd.length; i++) {
for (let j = 0; j < even.length; j++) {
if (isPrimeNumber(Number(odd[i]) + Number(even[j]))) {
result[i][j] = 1;
}
}
}
let res = 0;
for (let i = 0; i < odd.length; i++) {
if (oddX[i] == -1) {
for (let j = 0; j < flagX.length; j++) {
flagX[j] = 0;
}
// 每多找到一组增广路径res +1
res += dfs(i);
}
}
console.log(res);
// 清空
for (let i = 0; i < 100; i++) {
odd[i] = even[i] = 0;
}
for (let i = 0; i < 100; i++) {
for (let j = 0; j < 100; j++) {
result[i][j] = 0;
}
}
for (let i = 0; i < 100; i++) {
oddX[i] = evenX[i] = -1;
}
})();
文章系原创,在阅读过程中如若有误,劳请指正;如若有妙解、疑惑也欢迎大家和我交流,感谢!