当前位置: 首页 > article >正文

【JAVA】第3关:素数链

任务描述
编程要求
测试说明
任务描述
本关任务:把从 1 到 n 这 n 个数摆成一个链,要求相邻的两个数的和是一个素数。

编程要求
请在右侧编辑器Begin-End处补充代码,完成本关任务,输出格式请参考测试集。

测试说明
平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:

测试输入:15
预期输出:摆成的链是: 15 14 9 10 13 6 11 12 7 4 3 8 5 2 1

开始你的任务吧,祝你成功!

package step3;


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

public class Prime {
    // 判断一个数是否为素数
    private static boolean isPrime(int num) {
        
        if (num < 2) {
            return false; // 小于2的数不是素数
        }
        for (int i = 2; i * i <= num; i++) {
            if (num % i == 0) {
                return false; // 如果能被整除,则不是素数
            }
        }
        return true; // 否则是素数
    }

    // 判断两个数是否可以相连(即它们的和是否为素数)
    private static boolean canLink(int a, int b) {
        return isPrime(a + b); // 返回两个数之和是否为素数
    }

    // 寻找一个长度为n的链,链中的每两个相邻元素的和都是素数
    private static List<Integer> findChain(int n) {
        List<Integer> result = new ArrayList<>(); // 存储结果链
        boolean[] used = new boolean[n + 1]; // 标记数组,记录哪些数已经被使用

        // 从n开始向下寻找第一个未使用的数,并将其加入链中
        for (int i = n; i >= 1; i--) {
            if (!used[i]) {
                result.add(i); // 将未使用的数加入链中
                used[i] = true; // 标记该数为已使用
                break; // 跳出循环
            }
        }

        // 继续寻找链中的下一个数,直到链的长度达到n
        while (result.size() < n) {
            int last = result.get(result.size() - 1); // 获取链中的最后一个数
            boolean found = false; // 标记是否找到下一个数
            for (int next = n; next >= 1; next--) {
                if (!used[next] && canLink(last, next)) {
                    // 如果找到一个未使用且可以与最后一个数相连的数,将其加入链中
                    result.add(next);
                    used[next] = true; // 标记该数为已使用
                    found = true; // 标记找到下一个数
                    break; // 跳出循环
                }
            }
            if (!found) {
                // 如果没有找到下一个数,返回空链
                return new ArrayList<>();
            }
        }
        return result; // 返回找到的链
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in); // 创建Scanner对象用于读取用户输入
        int n = scanner.nextInt(); // 从用户输入中获取n的值
        List<Integer> chain = findChain(n); // 寻找长度为n的链

        System.out.print("摆成的链是: "); // 打印提示信息
        for (int num : chain) {
            System.out.print(num + " "); // 打印链中的每个数
        }
        System.out.println(); // 换行
        scanner.close(); // 关闭Scanner
    }
}

http://www.kler.cn/a/379464.html

相关文章:

  • PHP常量
  • CloudCompare——基于连通性的点云分类【2024最新版】
  • 大数据之Hadoop集群
  • 【大数据】ClickHouse常见的表引擎及建表语法
  • 【AIGC】如何充分利用ChatGPT:有效提示框架与基本规则
  • <项目代码>YOLOv8 猫狗识别<目标检测>
  • HJ43 迷宫问题
  • 虚拟机安装
  • 危机来临前---- 力扣: 876
  • 双指针-01-三数之和
  • LeetCode:3259. 超级饮料的最大强化能量(DP Java)
  • 架构师考试系列(8)论文专题:信息系统安全设计
  • 微服务系列三:微服务核心——网关路由
  • 穿越数据迷宫
  • 总结拓展十五:SAP物料分割评估
  • C++ | Leetcode C++题解之第530题二叉搜索树的最小绝对差
  • 解决Corrupt JPEG data: premature end of data segment
  • Oracle视频基础1.3.5练习
  • 操作系统(9) (并发-----原子性/互斥临界区/生产者消费者问题/临界区问题三条件/互斥性/进展性/公平性)
  • Linux(centOS)的安全命令
  • 鸿蒙移动应用开发-------前篇
  • 泛微开发修炼之旅--52关于ecology首页待办修改源码位置记录
  • Windows Qt 6安装Oracle QOCI SQL Driver插件
  • No.24 笔记 | WEB安全 - 任意文件包含漏洞 part 6
  • Flutter使用share_plus是提示发现了重复的类
  • 为什么https先非对称加密,然后对称加密?