0
点赞
收藏
分享

微信扫一扫

安卓大作业 图书管理APP

在这里插入图片描述

一、题目描述

若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如2和5、6和13,它们能应用于通信加密。现在密码学会请你设计一个程序,从已有的 N ( N 为偶数)个正整数中挑选出若干对组成“素数伴侣”,挑选方案多种多样,例如有4个正整数:2,5,6,13,如果将5和6分为一组中只能得到一组“素数伴侣”,而将2和5、6和13编组将得到两组“素数伴侣”,能组成“素数伴侣”最多的方案称为“最佳方案”,当然密码学会希望你寻找出“最佳方案”。

有一个正偶数 n ,表示待挑选的自然数的个数。后面给出 n 个具体的数字。

输出一个整数 K ,表示你求得的“最佳方案”组成“素数伴侣”的对数。

数据范围: 1≤n≤100,输入的数据大小满足 2≤val≤30000

二、输入描述

输入一个正偶数 n

输入 n 个整数

三、输出描述

求得的“最佳方案”组成“素数伴侣”的对数。

四、解题思路

  1. 从输入中读取一个正偶数n;
  2. 创建一个长度为n的整数数组nums,用于存储n个整数;
  3. 循环读取n个整数,将其存储到nums数组中;
  4. 创建两个列表,一个用于存储偶数,一个用于存储奇数。遍历nums数组,将偶数存储到偶数列表(evens)中,将奇数存储到奇数列表(odds)中;
  5. 创建一个长度为偶数列表evens的整数数组evenMatch,用于存储每个偶数的伴侣奇数。初始化count为0,用于记录素数伴侣的对数;
  6. 对每个奇数进行匹配操作。遍历奇数列表odds,依次取出一个奇数odd;
    • 创建一个布尔数组match,用于记录每个偶数是否已被占用。初始化为false;
    • 使用递归函数find()进行偶数的匹配。在find()函数中,依次遍历偶数列表evens,取出一个偶数even;
      • 如果该偶数未被占用且偶数与奇数的和是素数(调用isPrime()函数判断),则将该奇数设置为偶数的伴侣,即evenMatch[i] = odd,并将该偶数设置为已占用(match[i] = true);
      • 如果该偶数已被其他奇数占用,则递归调用find()函数,寻找其他可匹配的偶数;
    • 如果能找到素数匹配,则count加1;
  7. 输出count,即最佳方案组成素数伴侣的对数。

五、JavaScript算法源码

// 使用递归函数find()进行偶数的匹配
function find(odd, evens, evenMatch, match) {
    for (let i = 0; i < evens.length; i++) {
        const even = evens[i];
        // 如果该偶数未被占用且偶数与奇数的和是素数
        if (!match[i] && isPrime(even + odd)) {
            match[i] = true;
            // 如果该偶数已被其他奇数占用,则递归调用find()函数,寻找其他可匹配的偶数
            if (evenMatch[i] === 0 || find(evenMatch[i], evens, evenMatch, match)) {
                // 将该奇数设置为偶数的伴侣
                evenMatch[i] = odd;
                return true;
            }
        }
    }
    return false;
}

// 是否是素数
function isPrime(x) {
    if (x === 1) {
        return false;
    }
    for (let i = 2; i <= Math.sqrt(x); i++) {
        if (x % i === 0) {
            return false;
        }
    }
    return true;
}

function calculateBestPairs(input) {
    const nums = input.split(" ")
    // 存储偶数
    const evens = [];
    // 存储奇数
    const odds = [];

    for (let num of nums) {
        if (num % 2 === 0) {
            evens.push(num);
        } else {
            odds.push(num);
        }
    }

    // 存储每个偶数的伴侣奇数
    const evenMatch = new Array(evens.length).fill(0);
    // 素数伴侣的对数
    let count = 0;

    for (let odd of odds) {
        // 创建一个布尔数组match,用于记录每个偶数是否已被占用
        const match = new Array(evens.length).fill(false);
        // 如果能找到素数匹配,则count加1
        if (find(odd, evens, evenMatch, match)) {
            count++;
        }
    }

    // 最佳方案组成素数伴侣的对数
    return count;
}

六、效果展示

在这里插入图片描述


🏆下一篇:华为OD机试真题 JavaScript 实现【相对开音节】【2022Q4 100分】,附详细解题思路

🏆本文收录于,华为OD机试(JavaScript)真题(A卷+B卷)

每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

举报

相关推荐

0 条评论