0
点赞
收藏
分享

微信扫一扫

2021年 第12届 蓝桥杯 Java B组 决赛真题详解及小结【2021.06.05】

目录

一、试题A:整数范围(本题总分:5 分)

01解法一

二、试题B:纯质数(本题总分:5 分)

02解法一

三、试题C:完全日期(本题总分:10 分)

03解法一

四、试题D:最小权值(本题总分:10 分)

04解法一

五、试题E:大写(时间限制: 1.0s 内存限制: 512.0MB 本题总分:15 分)

05解法一

六、试题F:123(时间限制: 5.0s 内存限制: 512.0MB 本题总分:15 分)

06解法一

七、试题G:和与乘积(时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分)

07解法一

八、试题H:巧克力(时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分)

08解法一

九、试题I:翻转括号序列(时间限制: 10.0s 内存限制: 768.0MB 本题总分:25 分)

09解法一

十、试题J:异或三角(时间限制: 5.0s 内存限制: 512.0MB 本题总分:25 分)

10解法一

小结


一、试题A:整数范围(本题总分:5 分)

01解法一

package national_12_2021;

public class A01_整数范围 {
	public static void main(String[] args) {
		System.out.println(Integer.parseInt("11111111", 2)); // 255
	}
}

二、试题B:纯质数(本题总分:5 分)

02解法一

package national_12_2021;

import java.util.ArrayList;

public class B02_纯质数 {
	static int number = 20210605;// 测试的上限
	static int map[] = new int[number];
	static ArrayList<String> ans = new ArrayList();
	static int anscount = 0;

	public static void main(String[] args) {
		int count = 0;
		// 此for循环找出范围内所有的质数
		for (int i = 2; i <= number; i++) {
			boolean add = true;
			for (int j = 2; j * j <= i; j++) {
				if (i % j == 0) {
					add = false;
					continue;
				}
			}
			if (add == true) {
				map[count] = i;
				count++;
			}
		}
		//System.out.println("wanbi");
		// 此for循环对每个质数进行判断
		for (int i = 0; i < count; i++) {
			String single = String.valueOf(map[i]);
			//System.out.print(single+"   ");
			boolean shi = true;
			// 将这个质数转化为字符串后将其的每一个字符转化为数字
			flag: for (int j = 0; j < single.length(); j++) {
				Integer wei = Integer.valueOf(single.charAt(j) - 48);
				// 排除1和0
				if (wei == 1 || wei == 0) {
					shi = false;
					break;
				}
				// 判断这个位数是不是质数
				for (int k = 2; k * k <= wei; k++) {
					if (wei % k == 0) {
						shi = false;
						break flag;
					}
				}
				//System.out.print(wei+"  ");
			}
			// 如果这个质数是纯质数的话,总和+1
			if (shi == true) {
				System.out.println(single);
				ans.add(single);
				anscount++;
			}
			//System.out.println();

		}
		// 调试时的输出语句
//			for (int i = 0; i < count; i++) {
//				System.out.print(map[i]+" ");
//			}
//			System.out.println();
//			for (int i = 0; i < ans.size(); i++) {
//				System.out.print(ans.get(i)+" ");
//			}
		System.out.println();
		System.out.println(anscount);
	}
}

三、试题C:完全日期(本题总分:10 分)

03解法一

package national_12_2021;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;

public class C03_完全日期 {
	static int anscount = 0;

	public static void main(String[] args) throws ParseException {
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd");// 指定输入格式
		Date data = simpleDateFormat.parse("2001/01/01");// 获取指定日期的Data对象
//		System.out.println(data);
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(data);// 转化为对应的Calendar类的对象,以便利用其内现有的方法
		calendar.add(Calendar.DAY_OF_YEAR, 1);// 获取后相差了一天,把它加回去
//		System.out.println(calendar.toInstant());

		int[] list = new int[10];
		ArrayList<Integer> index = new ArrayList();

		for (int i = 1; i <= 20; i++) {
			index.add(i * i);
		}
		// 输出一下,看产生的完全平方数对不对
//		for (int i = 0; i < index.size(); i++) {
//			System.out.print(index.get(i) + "  ");
//		}
//		System.out.println();

		for (int i = 1; i <= 7670; i++) {
			StringBuilder yearsb = new StringBuilder();
			StringBuilder monthsb = new StringBuilder();
			StringBuilder daysb = new StringBuilder();
			// 太多数据看不过来,调试时将下面这个if打开,筛掉一部分数据
//			if(i<100 ||i>7600) {
			String datastr = calendar.toInstant().toString();// 将此时calendar储存的日期转化为字符串
			// 下面三个for从该字符串中获取年份的字符,
			for (int j = 0; j < 4; j++) {
				yearsb.append(datastr.charAt(j));
			}
			for (int j = 5; j < 7; j++) {
				monthsb.append(datastr.charAt(j));
			}
			for (int j = 8; j < 10; j++) {
				daysb.append(datastr.charAt(j));
			}
			// 紧接这的三个for将字符转换为数字
			int count = 0;
			for (int j = 0; j < yearsb.length(); j++) {
				list[count] = Integer.valueOf(yearsb.charAt(j) - 48);
				count++;
			}
			for (int j = 0; j < monthsb.length(); j++) {
				list[count] = Integer.valueOf(monthsb.charAt(j) - 48);
				count++;
			}
			for (int j = 0; j < daysb.length(); j++) {
				list[count] = Integer.valueOf(daysb.charAt(j) - 48);
				count++;
			}
			// 对所有数字进行累加
			int sum = 0;
			for (int j = 0; j < count; j++) {
//					System.out.print(list[j]+" ");
				sum += list[j];
			}
			// 判断是否在已经建立好的完全平方数表里面
			boolean contains = index.contains(sum);
			// 是的话计数器+1
			if (contains == true) {
//                System.out.println("  "+sum);
				anscount++;
			}
//			}
			calendar.add(Calendar.DAY_OF_MONTH, 1);
		}
		System.out.println(anscount);
	}
}

四、试题D:最小权值(本题总分:10 分)

04解法一

五、试题E:大写(时间限制: 1.0s 内存限制: 512.0MB 本题总分:15 分)

05解法一

package national_12_2021;

import java.util.Scanner;

public class E05_大写 {
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		String next = cin.next();
		String upperCase = next.toUpperCase();
		System.out.println(upperCase);
	}
}

六、试题F:123(时间限制: 5.0s 内存限制: 512.0MB 本题总分:15 分)

06解法一

七、试题G:和与乘积(时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分)

07解法一

package national_12_2021;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

public class G07_和与乘积 {
	static int dp[][][] = new int[10002][10002][2];
	static int list[] = new int[20002];
	static int n;

	public static void main(String[] args) throws IOException {
		Scanner cin = new Scanner(System.in);
		n = cin.nextInt();
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in), 1024);
//			System.out.println("test1");
		String[] split = br.readLine().split(" ");// 读入一整行,在用空格把这些数字分开

		for (int i = 1; i <= split.length; i++) {
			list[i] = Integer.valueOf(split[i - 1]);// 将字符串类型的数字转化为int类型,并存进数组里面
		}
//			System.out.println("test2");
		// 下面两个for用于初始化dp数组(初始化上文示意图中4个黑色箭头所指的地方)
		for (int i = 1; i <= n; i++) {
			for (int j = i; j <= n; j++) {
				if (i == j) {
					dp[i][j][0] = list[i];
					dp[i][j][1] = list[i];
				}
			}
		}

		for (int i = 1; i <= n; i++) {
			for (int j = i + 1; j <= n; j++) {
				dp[i][j][0] = dp[i][j - 1][0] + list[j];
				dp[i][j][1] = dp[i][j - 1][1] * list[j];
			}
		}

		int ans = n;
		for (int i = 1; i <= n; i++) {
			for (int j = i + 1; j <= n; j++) {
				if (dp[i][j][0] == dp[i][j][1]) {
					ans++;
				}
			}
		}

//			for (int i = 1; i <= n; i++) {
//				for (int j = 1; j <=n; j++) {
//					System.out.print("("+dp[i][j][0]+" "+dp[i][j][1]+")");
//				}
//				System.out.println();
//			}
		System.out.println(ans);
	}
}

八、试题H:巧克力(时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分)

08解法一

九、试题I:翻转括号序列(时间限制: 10.0s 内存限制: 768.0MB 本题总分:25 分)

09解法一

十、试题J:异或三角(时间限制: 5.0s 内存限制: 512.0MB 本题总分:25 分)

10解法一

小结

举报

相关推荐

0 条评论