2020 第十一届蓝桥杯 JAVA C组 省赛真题(解)

补充说明:一共有十道题,目前还需研究一下,后续会补充完整;多有不足或有不同思路欢迎大佬指教并分享;

试题 A: 指数计算

本题总分:5 分

【问题描述】

7 月 1 日是建党日,从 1921 年到 2020 年, 已经带领中国人民

走过了 99 年。

请计算:7 ^ 2020 mod 1921,其中 A mod B 表示 A 除以 B 的余数。

【答案提交】

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

题目分析:
题意是计算7的2020次幂 除以 1921取余;
数值非常大,第一时间想到的是可以用java中的大整数来解决(理论上大整数可以读取无限大的数);

public static void main(String[] args) {
     
		
		BigInteger a=new BigInteger("7");		
		BigInteger b=new BigInteger("1921");
		//pow返回第一个参数的第二个参数次方;
		//remainder(BigInteger val)_a.mod(b)_余数   %
		BigInteger temp =a.pow(2020).remainder(b);
		
		System.out.println(temp);		
	}

2020 第十一届蓝桥杯 JAVA C组 省赛真题(解)_第1张图片
————————————————————————
试题 B: 解密

本题总分:5 分

【问题描述】

小明设计了一种文章加密的方法:对于每个字母 c,将它变成某个另外的

字符 Tc。下表给出了字符变换的规则:

字母c 字符Tc 字母c 字符Tc 字母c 字符Tc 字母c 字符Tc
a y n i A Y N L
b x o g B X O G
c m p o C M P O
d d q u D D Q U
e a r f E A R F
f c s s F C S S
g i t z G I T Z
h k u p H K U P
i n v w I N V W
j t w b J T W B
k j x r K J X R
l h y e L H Y E
m q z v M Q Z V

例如,

将字符串 YeRi 加密可得字符串 EaFn。

小明有一个随机的字符串,加密后为

EaFnjISplhFviDhwFbEjRjfIBBkRyY

(由 30 个大小写英文字母组成,不包含换行符),请问原字符串是多少?

(如果你把以上字符串和表格复制到文本文件中,请务必检查复制的内容是否与文档中的一致。在试题目录下有一个文件 str.txt,第一行为上面的字符串,后面 52 行依次为表格中的内容。)

【答案提交】

这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个

只包含 30 个大小写英文字母的字符串,在提交答案时只填写这个字符串,填写多余的内容将无法得分。

题目分析:
这题可以用hashmap的键值对来求出相对应的字母,也可以直接用给的文本文件直接找到加密字母所对应的原字母(毕竟是填空题);
————————————————————————
试题 C: 跑步训练

本题总分:10 分

【问题描述】

小明要做一个跑步训练。

初始时,小明充满体力,体力值计为 10000。如果小明跑步,每分钟损耗600 的体力。

如果小明休息,每分钟增加 300 的体力。体力的损耗和增加都是均匀变化的。

小明打算跑一分钟、休息一分钟、再跑一分钟、再休息一分钟……如此循环。

如果某个时刻小明的体力到达 0,他就停止锻炼。

请问小明在多久后停止锻炼。为了使答案为整数,请以秒为单位输出答案。

答案中只填写数,不填写单位。

【答案提交】

这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,

在提交答案时只填写这个整数,填写多余的内容将无法得分。

题目分析:
小明初始体力为10000,均匀变化就是一分钟跑步一分钟休息,直到小明体力值为0时停止,求这个时间是以秒的形式;
(记录多少个一分钟也就是求出多少次,次数乘以60就是秒数(整数的情况)
,还要考虑600米没有跑完体力值就为零的情况,一分钟损耗600,一秒就是10点体力值;体力除以10就是秒数;)
【用的for循环,也可以用while循环】

public static void main(String[] args) {
     
	
		int sum=10000;//初始体力
		int count =0;//分钟
		boolean or = true;
		
		for (int i = 1;; i++) {
     
						
			if(sum<600 && or){
     
				break;
			}
			if(i%2!=0) {
     
				sum -= 600;
				or=false;
			}else {
     
				sum +=300;
				or=true;
			}
			count++;
		}
		//两种情况的相加得出总秒数;
		System.out.println(count*60+sum/10);

2020 第十一届蓝桥杯 JAVA C组 省赛真题(解)_第2张图片
还可以通过计算来求出结果:
(先跑后休息,也就是奇数时体力减600,偶数时体力加300,一跑一休息看成一个循环)
10000/(600-300)=33.33…
32*(600-300)=9600
10000-9600=400
400<600
总秒数:
32x2x60+400/10=3880

你可能感兴趣的:(java,蓝桥杯,java,算法)