2022年第十三届蓝桥杯省赛真题及部分答案解析(Java B组)

您所在的位置:网站首页 蓝桥杯历年真题及答案大全单片机 2022年第十三届蓝桥杯省赛真题及部分答案解析(Java B组)

2022年第十三届蓝桥杯省赛真题及部分答案解析(Java B组)

2024-07-12 13:03| 来源: 网络整理| 查看: 265

文章目录 第十三届蓝桥杯大赛软件赛省赛试题 A: 星期计算【填空题】试题 B: 山【填空题】试题 C: 字符统计【编程题】试题 D: 最少刷题数【编程题】试题 E: 求阶乘【编程题】试题 F: 最大子矩阵【编程题】试题 G: 数组切分【编程题】试题 H: 回忆迷宫【编程题】试题 I: 红绿灯【编程题】试题 J: 拉箱子【编程题】

第十三届蓝桥杯大赛软件赛省赛

原文链接

试题 A: 星期计算【填空题】 本题总分: 5 分

【问题描述】

已知今天是星期六,请问 20 22 ^{22} 22 天后是星期几? 注意用数字 1 到 7 表示星期一到星期日

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

第一种解法

利用java的大整数api求解

代码

import java.math.BigInteger; public class Main { public static void main(String[] args) { BigInteger bigInteger = BigInteger.valueOf(20).pow(22).mod(BigInteger.valueOf(7)); int result = (6 + bigInteger.intValue()) % 7; System.out.println(result == 0 ? 7 : result); } }

输出结果:7

第二种解法

利用计算器求解

picture 1

picture 2

天数取模后余1,则取当前星期对应数字加一,即6+1=7

第三种解法

如果直接求20 22 ^{22} 22再取余,20 22 ^{22} 22的结果基本类型是装不下的,所以可以在计算20 22 ^{22} 22的时候利用取余的运算规则先进行取余防止溢出。这个是常规的取余算法,当然还有快速幂取余法,不过对于这个题目,常规的算法就可以了

代码

public class Main { public static void main(String[] args) { int ans = 1; for (int i = 0; i 1 : (len >> 1) + 1; for (int i = 0; i chs[i + 1]) { return false; } } return true; } }

输出结果:3138

第二种解法

同第一种一样也是转化成字符串求解,不过只翻转一半,大概也要花个一分多钟就可以出结果了

代码

public class Main { public static void main(String[] args) { int cnt = 0; for (int i = 2022; i > 1; i >> 1) + (endLength & 1); i = start && num = start && num sameRight) { midOption = 1; } for (int i = 0, len = nums.length; i 1; // 中间的值 int midValue = temp[midIndex]; // int midOption = 0; // int option = 0; // 左边和中值相同值的数量 int sameLeft = 0; // 右边和中值相同值的数量 int sameRight = 0; int left = left(temp, 0, midIndex - 1, midValue); int right = right(temp, midIndex + (n & 1), n - 1, midValue); if (left != -1) { sameLeft = midIndex - left; } if (right != -1) { sameRight = 1 + right - midIndex; } if (sameLeft >= sameRight) { option = 1; } if (sameLeft > sameRight) { midOption = 1; } for (int i = 0, len = nums.length; i 1); if (arr[mid] >= target) { end = mid - 1; if (arr[mid] == target) { index = mid; } } else { start = mid + 1; } } return index; } public static int right(int[] arr, int start, int end, int target) { int index = -1; while (start >> 1); if (arr[mid] > target) { end = mid - 1; } else { start = mid + 1; if (arr[mid] == target) { index = mid; } } } return index; } }

感觉还是会超时,不过OJ运行过了,可能是巧合

结果

在这里插入图片描述 第三种解法

无需全部排序,通过选择算法找出中间值

代码

import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int[] nums = new int[n]; int[] temp = new int[n]; for (int i = 0; i >> 1); int l = 0, r = 0; for (int i = 0; i midValue) { r++; } else if (nums[i]


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3