##蓝桥杯 2020 Java c
#A 指数计算
问题描述
7 月 1 日是建党日,从 1921 年到 2020 年,中国共产党已经带领中国人民
走过了 99 年。
请计算:7 2020 7^{2020}7
2020
mod 1921,其中 A mod B 表示 A 除以 B 的余数。
答案提交
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个
整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
package Java2020;
import java.lang.annotation.Retention;
import java.math.BigInteger;
//public class 第一题 {
//
//
//
// public static void main(String[] args) {
//
// System.out.println(pow(7, 2020));
//
// }
// static final int mod = 1921;
//
// static int pow(int a,int n) {
// if(n == 0 ) return 1;
// if (n == 1) return a;
// if (0 == (n & 1)) return pow((a % mod)*(a % mod), n / 2) % mod;
// return ((a % mod) * (pow((a % mod) *(a % mod), n / 2) % mod)) % mod;
// }
//}
public class 第一题 {
public static void main(String[] args) {
System.out.println(new BigInteger("7").pow(2020).mod(new BigInteger("1921")));
}
}
#B 解密
问题描述
小明设计了一种文章加密的方法:对于每个字母 c,将它变成某个另外的
字符Tc 下表给出了字符变换的规则:
例如,将字符串 YeRi 加密可得字符串 EaFn。
小明有一个随机的字符串,加密后为
EaFnjISplhFviDhwFbEjRjfIBBkRyY
(由 30 个大小写英文字母组成,不包含换行符),请问原字符串是多少?
(如果你把以上字符串和表格复制到文本文件中,请务必检查复制的内容
是否与文档中的一致。在试题目录下有一个文件 str.txt,第一行为上面的字符
串,后面 52 行依次为表格中的内容。)
package Java2020;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class 第二题 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); //加密后的字符
String str = scanner.next();
Map<String, String> map = new HashMap<String, String>();
for (int i = 0; i < 52; i++) {
String s1 = scanner.next(); //加密前的字符
String s2 = scanner.next(); //加密前的字符
map.put(s2, s1);
}
String str2="";
for (int i = 0; i < str.length(); i++) {
str2+=map.get(str.charAt(i)+""); //拿到加密前的字符
}
System.out.println(str2);
}
}
#C 跑步训练
小明要做一个跑步训练。
初始时,小明充满体力,体力值计为 10000。如果小明跑步,每分钟损耗
600 的体力。如果小明休息,每分钟增加 300 的体力。体力的损耗和增加都是
均匀变化的。
小明打算跑一分钟、休息一分钟、再跑一分钟、再休息一分钟……如此循
环。如果某个时刻小明的体力到达 0,他就停止锻炼。
请问小明在多久后停止锻炼。为了使答案为整数,请以秒为单位输出答案。
答案中只填写数,不填写单位。
package Java2020c;
public class 第3题 {
public static void main(String[] args) {
int a = 10000;
int time = 0;
while (a>600) {
a-=600;
a+=300;
time++;
}
System.out.println(time*2*60+a/(600/60));
}
}
#D 合并检测
问题描述
新冠疫情由新冠病毒引起,最近在 A 国蔓延,为了尽快控制疫情,A 国准备给大量民众进病毒核酸检测。然而,用于检测的试剂盒紧缺。
为了解决这一困难,科学家想了一个办法:合并检测。即将从多个人(k个)采集的标本放到同一个试剂盒中进行检测。如果结果为阴性,则说明这 k个人都是阴性,用一个试剂盒完成了 k 个人的检测。如果结果为阳性,则说明至少有一个人为阳性,需要将这 k 个人的样本全部重新独立检测(从理论上看,如果检测前 k − 1 个人都是阴性可以推断出第 k 个人是阳性,但是在实际操作中不会利用此推断,而是将 k 个人独立检测),加上最开始的合并检测,一共使用了 k + 1 个试剂盒完成了 k 个人的检测。A 国估计被测的民众的感染率大概是 1%,呈均匀分布。请问 k 取多少能最节省试剂盒?
package Java2020;
public class 第四题 {
public static void main(String[] args) {
int max = 10000, min = 0x7ffffff,res = 0;
for (int i = 2; i < max ; i++) {
int cnt = max / i + max / 100 * i + (max % i == 0? 0:1);
if (cnt<min) {
min = cnt;
res = i;
}
}
System.out.println(res);
}
}
#E REPEAT 程序
附件 prog.txt 中是一个用某种语言写的程序。 其中 REPEAT k 表示一个次数为 k 的循环。循环控制的范围由缩进表达,从次行开始连续的缩进比该行多的(前面的空白更长的)为循环包含的内容。 例如如下片段:
REPEAT 2:
A = A + 4
REPEAT 5:
REPEAT 6:
A = A + 5
A = A + 7
A = A + 8
A = A + 9
该片段中从 A = A + 4 所在的行到 A = A + 8 所在的行都在第一行的循环两次中。REPEAT 6: 所在的行到 A = A + 7 所在的行都在 REPEAT 5: 循环中。A = A + 5 实际总共的循环次数是 2 × 5 × 6 = 60 次。请问该程序执行完毕之后,A 的值是多少?
package Java2020;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.security.KeyStore.Entry;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class 第五题 {
public static void main(String[] args) throws FileNotFoundException {
Scanner in = new Scanner(new FileInputStream("prog.txt"));
Map<String, Integer> map = new HashMap();
while (in.hasNext()) {
String now = in.next();
Integer cnt = map.get(now);
if (cnt == null) {
map.put(now,1);
}else {
map.put(now, cnt+1);
}
for (java.util.Map.Entry<String, Integer> e: map.entrySet()) {
System.out.println(e.getKey()+": " + e.getValue());
}
}
}
}
试题 F: 分类计数
【问题描述】
输入一个字符串,请输出这个字符串包含多少个大写字母,多少个小写字母,多少个数字。
【输入格式】
输入一行包含一个字符串。
【输出格式】
输出三行,每行一个整数,分别表示大写字母、小写字母和数字的个数。
【样例输入】
1+a=Aab
【样例输出】
1
3
1
package Java2020;
import java.util.Scanner;
public class 第六题 {
public static void main(String[] args) {
int number = 0;
int capital = 0;
int Lowletters = 0;
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
for (int i = 0; i < str.length(); i++) {
char a = str.charAt(i);
if (a >= '0' && a <= '9') {
number++;
}else if (a >= 'a' && a <= 'z') {
capital++;
}else if (a >= 'A' && a <= 'Z'){
Lowletters++;
}
}
System.out.println(number);
System.out.println(capital);
System.out.println(Lowletters);
}
}
试题 G: 整除序列
【问题描述】
本题总分:15 分
有一个序列,序列的第一个数是 n,后面的每个数是前一个数整除 2,请输出这个序列中值为正数的项。
【输入格式】
输入一行包含一个整数 n。
【输出格式】
输出一行,包含多个整数,相邻的整数之间用一个空格分隔,表示答案。
【样例输入】
20
【样例输出】
20 10 5 2 1
【评测用例规模与约定】
对于 80% 的评测用例,1 ≤ n ≤ 109。
对于所有评测用例,1 ≤ n ≤ 1018。
package Java2020;
import java.util.Scanner;
public class 第七题 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long a = sc.nextLong();
while (a != 0) {
a=a/2;
if (a == 0) {
break;
}
System.out.print(a+" ");
}
}
}
试题 H: 走方格
本题总分:20 分
【问题描述】
在平面上有一些二维的点阵。这些点的编号就像二维数组的编号一样,从上到下依次为第 1 至第 n 行,从左到右依次为第 1 至第 m 列,每一个点可以用行号和列号来表示。现在有个人站在第 1 行第 1 列,要走到第 n 行第 m 列。只能向右或者向下走。注意,如果行号和列数都是偶数,不能走入这一格中。问有多少种方案。
【输入格式】
输入一行包含两个整数 n, m。
【输出格式】
输出一个整数,表示答案。
【样例输入】
3 4
【样例输出】
2
【样例输入】
6 6
【样例输出】
0
【评测用例规模与约定】
对于所有评测用例,1 ≤ n ≤ 30, 1 ≤ m ≤ 30。
package Java2020;
import java.util.Scanner;
public class 第八题 {
private static int m;
private static int n;
private static int sum;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
m = scanner.nextInt();
sum = 0;
dfs(1,1);
System.out.println(sum);
}
private static void dfs(int i, int j) {
if (i>n||j>m) {
return;
}
if (i%2 == 0 && j%2 == 0) {
return;
}
if (i==n&&j==m) {
sum++;
return;
}
dfs(i+1,j);
dfs(i,j+1);
}
}