十三届蓝桥杯省赛题目解析(不断更新版)
A. 字母排序
题目描述
解题思路
A题相对比较简单,这题有两种解法
第一种是可以利用记事本把文本复制,然后自己手动排序
第二种是写代码:具体思路是定义一个字符串用来储存问文本,然后把文本转成字符型数组,利用Arrays.sort对字符型数组进行排序,最终实现字符的排序
代码示例
import java.util.Arrays;
import java.util.Scanner;
public class A {
static String str;
static char[] chars;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
str = scan.next();
chars = new char[str.length()];
trans();
Arrays.sort(chars);
print();
}
private static void trans() {
for (int i = 0; i < str.length(); i++) {
chars[i]=str.charAt(i);
}
}
private static void print(){
for (char a:chars) {
System.out.print(a);
}
}
}
B. 特殊时间
题目描述
2022年2月22日22:2022:20 是一个很有意义的时间, 年份为2022,由3个2和1个0
组成, 如果将月和日写成4位, 为0222,也是由3个2和1个0组成, 如果将时间中的
时和分写成4位, 还是由 3个2 和1个0组成。
小蓝对这样的时间很感兴趣, 他还找到了其它类似的例子, 比如111年10月11日
01:11,220201:11,2202 年2月22日22:0222:02等等。
请问, 总共有多少个时间是这种年份写成4位月日写成4 位时间写成4位后由3个
一种数字和 1 个另一种数字组成。注意1111年11月11日11: 1111:11不算,因为
它里面没有两种数字
解题思路
因为时间里面只有两个不同的数字,我们可以通过对两个数字的遍历去组成不同的四位数,然后通过check_month和check_time函数去判别组成的四位数是否合格(是否符合时间或者是日期的标准)最后累加在一起就可以求出最终的结果
代码示例
public class B {
static int[] day_month ={
0,31,28,31,30,31,30,31,31,30,31,30,31};
/**检查年月日是否合法*/
public static int check_month(int D){
int M = D/100;//取得月份
int day = D%100;//取得天数
if(M<1||M>12)return 0;
if (day<=1||day>day_month[M])return 0;
return 1;
}
/**判断时间是否合法*/
public static int check_time(int m){
int H = m/100;//取得小时
int M = m%100;//取得分钟数
if (H<0||H>23) return 0;
if (M<0||M>59) return 0;
return 1;
}
public static void main(String[] args) {
int count=0;//记录匹配个数
/**因为时间里只包含两个数字,所以我们这里只开两重循环*/
for (int a = 0; a <= 9; a++)
for (int b = 0; b <= 9; b++)
if(a!=b){
int year =4;//两个数字可以匹配到的年份有四种
int month=0;//与之匹配的月份我们要去做检查月份天数是否成立,所以放在下面赋值
int time=0;//同上月份一样要放在上边进行与之匹配
int[] A = new int[]{
a,a,a,a};
//枚举四种情况即aaab,aaba,abaa,baaa;
for (int i = 0; i < 4; i++) {
A[i]=b;
int num = 0;//用来拼接与之对应的情况的数字
for (int j = 0; j < 4; j++) {
num = num * 10 + A[j];
}
month += check_month(num);
time += check_time(num);//与之匹配的时间可能会多,每匹配一次就去加1
A[i]=a;
}
count+=year*month*time;//每调整一次数字位置就计算一次
}
System.out.println(count);
}
}
C. 纸张尺寸
题目描述
在 ISO国际标准中定义了A0 纸张的大小为1189mm×841mm, 将A0纸沿长边对折后
为A1纸, 大小为841mm× 594mm, 在对折的过程中长度直接取下整 (实际裁剪时可
能有损耗)。将 A1 纸沿长边对折后为A2 纸, 依此类推。
输入纸张的名称, 请输出纸张的大小。
输入格式
输入一行包含一个字符串表示纸张的名称, 该名称一定是 A0、A1、A2、 A3、A4、A5、A6、A7、A8、A9 之一。
输出格式
输出两行,每行包含一个整数,依次表示长边和短边的长度。
输入样例
A0
输出样例
1189
841
解题思路
按照题目详情我们可以知道,要根据输入的纸张型号去输出相对的纸张大小,题目有两种思路:
其一:自己计算出每种纸张的大小,然后通过字符比对去输出相对型号的相对大小(若是自己写不出代码的话建议放弃)
其二:用Integer的pareseInt函数把输入的第二个字符转化成数字,然后通过for循环去计算出与之对应的纸张大小,然后输出
可以把我最后的if else删掉,放在那里只是为了严谨一些
代码示例
import java.util.Scanner;
public class C {
static int Long=1189;
static int wide=841;
static String size;//用来获取纸张型号
static int sizeID;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
size= scan.next();
sizeID=Integer.parseInt(String.valueOf(size.charAt(1)));
for (int i = 0; i < sizeID; i++) {
if (Long > wide) {
Long/=2;
}else{
wide/=2;
}
}
if (Long > wide) {
System.out.println