试题 A: 解密
本题总分:5 分
【问题描述】
小明设计了一种文章加密的方法:对于每个字母 c,将它变成某个另外的字符 Tc。下表给出了字符变换的规则:
例如,将字符串 YeRi 加密可得字符串 EaFn。
小明有一个随机的字符串,加密后为
EaFnjISplhFviDhwFbEjRjfIBBkRyY
(由 30 个大小写英文字母组成,不包含换行符),请问原字符串是多少?
【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个只包含 30 个大小写英文字母的字符串,在提交答案时只填写这个字符串,填写多余的内容将无法得分。
【答案】:YeRikGSunlRzgDlvRwYkXkrGWWhXaA
解法一:直接对照表格手工计算
解法二:
String.indexOf:public int indexOf(int ch)返回指定字符在此字符串中第一次出现处的索引。
public String substring(int beginIndex, int endIndex)
返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的 beginIndex 处开始, endIndex:到指定的 endIndex-1处结束。
public class SolveMi {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "EaFnjISplhFviDhwFbEjRjfIBBkRyY"; // 加密后的字符
char[] arr = str.toCharArray();
String s1 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 原字符
String s2 = "yxmdacikntjhqlgoufszpwbrevYXMDACIKNTJHQLGOUFSZPWBREV"; // 加密后的字符
String s3 = ""; // 解密后的字符
for (int i = 0; i < arr.length; i++) {
int j = s2.indexOf(arr[i]); // 当前字符在加密后字符中的位置
s3 += s1.substring(j, j + 1); // 找出原字符在此位置对应的字符[j,j+1)
}
System.out.println(s3);
}
}
试题 B: 纪念日
本题总分:5 分
【问题描述】
2020 年 7 月 1 日是中国共产党成立 99 周年纪念日。
中国共产党成立于 1921 年 7 月 23 日。
请问从 1921 年 7 月 23 日中午 12 时到 2020 年 7 月 1 日中午 12 时一共包含多少分钟?
【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个 整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
【答案】:52038720
使用“计算器”求解,找到日期计算,算出天数,36138天,然后求分钟数
试题 D: 合并检测
本题总分:10 分
【问题描述】
新冠疫情由新冠病毒引起,最近在 A 国蔓延,为了尽快控制疫情,A 国准备给大量民众进病毒核酸检测。
然而,用于检测的试剂盒紧缺。
为了解决这一困难,科学家想了一个办法:合并检测。即将从多个人(k 个)采集的标本放到同一个试剂盒中进行检测。如果结果为阴性,则说明这 k 个人都是阴性,用一个试剂盒完成了 k 个人的检测。如果结果为阳性,则说明至少有一个人为阳性,需要将这 k 个人的样本全部重新独立检测(从理论上看,如果检测前 k − 1 个人都是阴性可以推断出第 k 个人是阳性,但是在实际操作中不会利用此推断,而是将 k 个人独立检测),加上最开始的合并检测,一共使用了 k + 1 个试剂盒完成了 k 个人的检测。
A 国估计被测的民众的感染率大概是 1%,呈均匀分布。请问 k 取多少能最节省试剂盒?
【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个 整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
【答案】:10
假设A国有n个人,感染者有n/100
每k个人一组,共n/k组,共用n/k瓶试剂
按照最坏的情况,每多出一个感染者就多用k瓶试剂,
因此共用n/k+(n/100)*k瓶试剂
n是定值,所以求(1/k+k/100)最小
由于a+b>=2√ab
当且仅当a = b时,取等号
即1/k=k/100时,取得最小值
解得k = 10
试题 E: 斐波那契数列最大公约数
本题总分:15 分
【问题描述】
斐波那契数列满足 F1 = F2 = 1,从 F3 开始有 Fn = Fn−1 + Fn−2。请你计算 GCD(F2020, F520),其中 GCD(A, B) 表示 A 和 B 的最大公约数。
【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

试题F: 分类计数
【问题描述】
输入一个字符串,请输出这个字符串包含多少个大写字母,多少个小写字母,多少个数字。
【输入格式】
输入一行包含一个字符串。
【输出格式】
输出三行,每行一个整数,分别表示大写字母、小写字母和数字的个数。
【样例输入】
1+a=Aab
【样例输出】
1 3 1
【评测用例规模与约定】
对于所有评测用例,字符串由可见字符组成,长度不超过 100。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.next();
char[] temp = str.toCharArray();
int upper = 0, lower = 0, digit = 0;
for (int i = 0; i < temp.length; i++) {
if ('A' <= temp[i] && temp[i] <= 'Z') {
upper++;
} else if ('a' <= temp[i] && temp[i] <= 'z') {
lower++;
} else if ('0' <= temp[i] && temp[i] <= '9') {
digit++;
}
}
System.out.println(upper + " " + lower + " " + digit);
}
}
试题G: 八次求和
时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分
【问题描述】
给定正整数 n, 求 1^ 8 + 2 ^ 8 + · · · + n^8 mod 123456789 。其中 mod 表示取余。
【输入格式】
输入的第一行包含一个整数 n。
【输出格式】
输出一行,包含一个整数,表示答案。
【样例输入】
2
【样例输出】
257
【样例输入】
987654
【样例输出】
43636805
【评测用例规模与约定】
对于 20% 的评测用例,1 ≤ n ≤ 20。
对于 60% 的评测用例,1 ≤ n ≤ 1000。
对于所有评测用例,1 ≤ n ≤ 1000000。
这种题目是大数求和,一般的数据类型会溢出,不能用。
用BigInteger来处理大数。
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
BigInteger begin; // 记录每次遍历的数,并对其求8次幂
BigInteger sum = BigInteger.ZERO; // 0 , 记录每次求和结果
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
// 遍历求和
for (int i = 1; i <= n; i++) {
begin = BigInteger.valueOf(i).pow(8);// 对每个数未8次幂
sum = sum.add(begin); // 求和
}
String model = "123456789";
//对结果mod123465789并打印输出
System.out.println(sum.mod(new BigInteger(model)));
}
}
BigInteger2.0:棋盘放麦子
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
你一定听说过这个故事。国王对发明国际象棋的大臣很佩服,问他要什么报酬,大臣说:请在第 11 个棋盘格放 11 粒麦子,在第 22 个棋盘格放 22 粒麦子,在第 33 个棋盘格放 44 粒麦子,在第 44 个棋盘格放 88 粒麦子,…后一格的数字是前一格的两倍,直到放完所有棋盘格(国际象棋共有 6464 格)。
国王以为他只是想要一袋麦子而已,哈哈大笑。
当时的条件下无法准确计算,但估算结果令人吃惊:即使全世界都铺满麦子也不够用!
请你借助计算机准确地计算,到底需要多少粒麦子。
https://blog.youkuaiyun.com/zjojk/article/details/115310812

https://www.cnblogs.com/yangyquin/p/5023990.html
BigInteger类成员方法
public BigInteger add(BigInteger val):加
public BigInteger subtract(BigInteger val):减
public BigInteger multiply(BigInteger val):乘
public BigInteger divide(BigInteger val):除
public BigInteger[] divideAndRemainder(BigInteger val):返回商和余数的数组
import java.math.BigInteger;
public class 棋盘放麦子 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//BigInteger big=new BigInteger("2").pow(64);
BigInteger big=BigInteger.valueOf(2).pow(64);
System.out.print(big.subtract(BigInteger.ONE));
}
}
试题 H: 字符串编码
时间限制: 1.0s 内存限制: 512.0MB 本题总分:25 分
【问题描述】
小明发明了一种给由全大写字母组成的字符串编码的方法。对于每一个大写字母,小明将它转换成它在 26 个英文字母中序号,即 A → 1, B → 2, … Z → 26。
这样一个字符串就能被转化成一个数字序列:
比如 ABCXYZ → 123242526。
现在给定一个转换后的数字序列,小明想还原出原本的字符串。当然这样的还原有可能存在多个符合条件的字符串。小明希望找出其中字典序最大的字符串。
【输入格式】
一个数字序列。
【输出格式】
一个只包含大写字母的字符串,代表答案。
【样例输入】
123242526
【样例输出】
LCXYZ
【评测用例规模与约定】
对于 20% 的评测用例,输入的长度不超过 20。
对于所有评测用例,输入的长度不超过 200000。
import java.util.Scanner;
public class StringCode {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s=new Scanner(System.in);
String str=s.next();
char[]c=str.toCharArray();
int i;
for(i=0;i<c.length-1;i++){
int x=c[i]-'0';
int y=c[i+1]-'0';
if(x*10+y<=26){
i++;
System.out.print((char)(x*10+y+64));
}
else{
System.out.print((char)(x+64));
}
}
if(i<c.length) System.out.print((char)(c[c.length-1]-'0'+64));
}
}

520

被折叠的 条评论
为什么被折叠?



