华为OD机试真题(Java),素数伴侣(100%通过+复盘思路)

news/2024/7/20 19:58:51 标签: java, 华为od, 算法

在这里插入图片描述

一、题目描述

若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如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

二、输入描述

  1. 输入一个正偶数 n
  2. 输入 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,即最佳方案组成素数伴侣的对数;

五、Java算法源码

java">public static void main(String [] args){
    Scanner in = new Scanner(System.in);
    while(in.hasNext()){
        int n = in.nextInt();
        //定义数组
        int [] nums = new int[n];
        for(int i = 0;i < n ;i++){
            nums[i] = in.nextInt();
        }
        //分装为 偶数数组 和奇数数组
        List<Integer> evens = new ArrayList<>();
        List<Integer> odds = new ArrayList<>();

        for(int num:nums){
            if(num % 2 ==0){
                evens.add(num);
            }else{
                odds.add(num);
            }
        }
        //偶数的伴侣
        int [] evenMatch = new int[evens.size()];
        int count = 0;
        //用每个奇数 尝试匹配偶数
        for(int i = 0;i < odds.size();i++){
            int odd = odds.get(i);
            //偶数是否被占用
            boolean [] match = new boolean[evens.size()];
            if(find(odd,evens,evenMatch,match)){
                count++;
            }
        }
        System.out.println(count);

    }
}

private static boolean find(int odd,List<Integer> evens,int [] evenMatch,boolean [] match){
    for(int i = 0;i < evens.size();i++){
        int even = evens.get(i);
        //挨个匹配 偶数
        if(!match[i] && isPrime(even + odd)){
            //这个偶数没有被占用 且 偶数+奇数 为素数
            //增加访问标记
            match[i] = true;
            if(evenMatch[i] == 0 || find(evenMatch[i],evens,evenMatch,match)){
                //偶数索引对应的 素数为0 说明没有被其他素数占用 或者可以找到素数
                //则将该奇数设置为偶数的伴侣
                evenMatch[i] = odd;
                //找到了素数
                return true;
            }

        }
    }
    return false;
}


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

六、效果展示

在这里插入图片描述


🏆下一篇:华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路

🏆本文收录于,华为OD机试(JAVA)(2022&2023)

本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。

在这里插入图片描述


http://www.niftyadmin.cn/n/465534.html

相关文章

Gartner宣布,亚马逊云科技全球数据库市场份额超四分之一

对比常规的基础设施上云和应用上云,企业对于数据上云一直保持最为慎重的态度。不过也不是一成不变的,Gartner前不久公布的一组数据显示,在2022年全球数据库管理系统的市场份额排名中,作为纯云厂商的亚马逊云科技,超越了老牌传统数据库厂商甲骨文和微软,首次位居第一。 降低企业…

JavaWeb 第一个Servlet程序

1.Servlet Servlet是Java编写的用于Web应用程序的服务器端程序。 它可以接收来自Web浏览器的HTTP请求并生成响应。 Servlet通常用于创建动态Web内容&#xff0c;例如网页、表单处理、登录和数据库访问等。 Servlet是Java EE&#xff08;Enterprise Edition&#xff09;规范…

java的嵌套类(nested class)、内部类(inner class)的区别

嵌套类即nested class&#xff0c;内部类即Inner class。 概括来说&#xff0c;嵌套类的概念比内部类概念大。嵌套类包含内部类和非内部类。一个内部类一定是一个嵌套类&#xff0c;但一个嵌套类不一定是一个内部类。 在一个类内部或者接口内部声明的类是嵌套类。 下面这些类是…

逆向工具(IDA、pyinstxtractor+uncompyle6、jadx等持续更新)

IDA Pro IDA Pro&#xff08;Interactive Disassembler Professional&#xff09;交互式反汇编器专业版&#xff0c;CTF、RE、PWN必备。 打开一个可执行文件前&#xff0c;应先用file命令或者DIE等工具&#xff0c;确定是32位还是64位&#xff0c;然后用相应的IDA工具打开可执…

简单图论:迷路

题目链接 迷路 题目描述 windy 在有向图中迷路了。 该有向图有 n n n 个节点&#xff0c;节点从 1 1 1 至 n n n 编号&#xff0c;windy 从节点 1 1 1 出发&#xff0c;他必须恰好在 t t t 时刻到达节点 n n n。 现在给出该有向图&#xff0c;你能告诉 windy 总共有…

地下水数值模拟软件有哪些??GMS、Visual MODFLOW Flex、FEFLOW、MODFLOW

目录 ①全流程GMS地下水数值模拟技能培养及溶质运移反应问题深度解析 ②Visual modflow Flex地下水数值模拟及参数优化、抽水实验设计与处理、复杂的饱和/非饱和地下水流分析 ③全流程各工程类型地下水环境影响评价【一级】方法与MODFLOW Flex建模 ④地下水热耦合模拟FEFLO…

高效进行接口测试,简单易懂!

目录 前言 正文 1.Api文档导入 2.后端接口测试 3.mock数据 4.测试集接口自动化 总结 前言 日常测试过程中&#xff0c;常常需要多种工具来接力完成自己的接口测试任务。 比如说&#xff0c; 使用swagger查看接口文档&#xff0c; 使用mock编造接口数据对前端页面做测试…

Python爬虫之数据解析技术

Python爬虫需要数据解析的原因是&#xff0c;爬取到的网页内容通常是包含大量标签和结构的HTML或XML文档。这些文档中包含所需数据的信息&#xff0c;但是需要通过解析才能提取出来&#xff0c;以便后续的处理和分析。 以下是一些使用数据解析的原因&#xff1a; 数据提取&…