第十一届蓝桥杯Java C组 省赛真题(1)

试题 A: 指数计算

本题总分:5 分

【问题描述】

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

走过了 99 年。

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

【答案提交】

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

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

【代码如下】

import java.math.BigInteger;

/**
 * 请计算:7 ^ 2020 mod 1921,其中 A mod B 表示 A 除以 B 的余数。
 * @author hf
 *
 */
public class Blogs3 {
     
	public static void main(String[] args) {
     
		BigInteger x = new BigInteger("7");
		BigInteger y = new BigInteger("1921");
		// remainder():取余 ; pow(): 幂函数
		BigInteger z = x.pow(2020).remainder(y); 
		System.out.println(z); 
	}
}

【填空结果】
第十一届蓝桥杯Java C组 省赛真题(1)_第1张图片

试题 B: 解密

第十一届蓝桥杯Java C组 省赛真题(1)_第2张图片
【解题思路】

  1. 最开始想找这个密码转换有没有什么规律,然后就画了个图第十一届蓝桥杯Java C组 省赛真题(1)_第3张图片从这个图里看出来根本没什么规律,是我想多了,而且这只是第二题,不需要想那么复杂。
  2. 本道题是一道填空题,而且随机字符串个数不多,我们可以直接通过表格一一对应找到答案即可。
  3. 使用集合中的HashMap键值对储存表中转换密码数据,键值对的数据可以直接在代码中定义,或者通过输入储存在键值对中,建议使用后者,题中给了一个txt文件,所以后者比前者做题时间较快。
  4. 使用数组下标与字母的一一对应,eg:arr [0]这个表示字母a,那么它对应的y就转换成相应的数字储存到这个arr[0]中,最后在转换回来,稍微比较麻烦,在这道题上比较浪费时间,有兴趣的可以写写。

【代码如下】

import java.util.HashMap;
import java.util.Scanner;

/**
 * @author hf
 *
 */
public class Blogs1 {
     
	public static void main(String[] args) {
     
		HashMap<Character, Character> coadMap = new HashMap<>(); //用来储存表格的键值对
		Scanner sc = new Scanner(System.in);
		// 将52组密码输入并且存入hashmap中
		for (int i = 0; i < 52; i++) {
     
			char c = sc.next().trim().charAt(0);
			char tc = sc.next().trim().charAt(0);
			coadMap.put(c, tc);
		}
		
		String str = sc.next(); // 输入要转换的密码字符串
		char [] ch = str.toCharArray(); // 将字符串转换成字符数组
		// 通过循环将每个字符进行转换
		for (char c : ch) {
     
			System.out.print(coadMap.get(c));
		}
		sc.close();
	}
}

【填空结果】
第十一届蓝桥杯Java C组 省赛真题(1)_第4张图片

试题 C: 跑步训练

本题总分:10 分

【问题描述】

小明要做一个跑步训练。

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

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

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

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

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

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

【答案提交】

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

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

【解题思路】

  1. 单纯的计算思路:跑一分钟消耗600体力,休息一分钟增加300体力,那么合在一块儿就是每两分钟消耗300体力(这个的前提是:两分钟中有消耗600体力的能力),这样的话,10000/300≈33个两分钟(但32个两分钟消耗的体力 = 9600,没有办法再消耗600体力了)。还剩下400体力,又因为一分钟消耗600体力,相当于1秒钟消耗10体力,那么400体力 => 40秒。故:运动时间 = 32个两分钟 + 40秒 = 3800秒。
  2. 根据上面的计算思路,也可以转化成代码,但是由于是计算机,它的计算速度不需要将两分钟合并计算的操作。

【代码如下】

/**
 * 初始时,小明充满体力,体力值计为 10000。如果小明跑步,每分钟损耗600 的体力。
 * 
 * 如果小明休息,每分钟增加 300 的体力。体力的损耗和增加都是均匀变化的。
 * 
 * 小明打算跑一分钟、休息一分钟、再跑一分钟、再休息一分钟……如此循环。
 * 
 * 如果某个时刻小明的体力到达 0,他就停止锻炼。
 * 
 * 请问小明在多久后停止锻炼。
 * 
 * @author hf
 *
 */
public class Blogs2 {
     
	public static void main(String[] args) {
     
		int start = 10000; // 起始值 
		boolean f = true; // 用来判断是消耗还是休息
		int min = 0; // 分钟
  		
		while (true) {
     
			// 跳出循环的条件
			if (start < 600 && f) {
     
				break;
			}
			if (f) {
     
				start -= 600;
				f = false;
			}else {
     
				start += 300;
				f = true;
			}
			min++; //不管是消耗还是增加体力分钟每轮循环都+1
		}
		// 获得总运动时间:其中因为一分钟消耗600体力,相当于1秒钟消耗10体力
		int y = min * 60 + (start / 10); 
		System.out.println(y);
	}
}

【填空结果】

第十一届蓝桥杯Java C组 省赛真题(1)_第5张图片

第4~6题

第十一届蓝桥杯Java C组 省赛真题(2)

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