第十二届蓝桥杯 2021年省赛真题 (Java 大学C组) 第二场

蓝桥杯 2021年省赛真题 (Java 大学C组) 第二场

                #A 浮点数

                #B 求余

                #C 双阶乘

                #D 格点

                #E 整数分解

                #F 3 的倍数

                #G 特殊年份

                #H 小平方

                #I 完全平方数

                #J 负载均衡


#A 浮点数

题目:

问题描述

IEEE 754 规定一个双精度浮点数由 1位符号位、11 位阶和 52 位尾数组成(以上位数都表示二进制位数)。
请问,按此规定一个双精度浮点数占用几个字节?

答案提交

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

代码:

public class Test {

    public static void main(String[] args) {
        System.out.println(1 + 11 + 52 >> 3);
    }
}

答案:8

这道题就不用说了吧


#B 求余

题目:

问题描述

在 C/C++/Java/Python 等语言中,使用 % 表示求余,请问 2021%20 的值是多少?

答案提交

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

代码:

import java.util.*;
 
public class Main
{
    public static void main(String args[])
    {
        System.out.println(2021%20);
    }
}

答案:1

直接打印输出就行


#C 双阶乘

题目:

问题描述

一个正整数的双阶乘,表示不超过这个正整数且与它有相同奇偶性的所有正整数乘积。n 的双阶乘用 n!!表示。
例如:
3 ! ! = 3 × 1 = 3。
8 ! ! = 8 × 6 × 4 × 2 = 384。
11 ! ! = 11 × 9 × 7 × 5 × 3 × 1 = 10395。
请问,2021!! 的最后 5 位(这里指十进制位)是多少?
注意:2021!!=2021×2019×⋅⋅⋅×5×3×1。
提示:建议使用计算机编程解决问题。
答案提交

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

代码:

import java.util.*;
 
public class Main
{
    public static void main(String args[])
    {
        long num = 1;
		for (int i = 1; i <= 2021; i += 2) {
			num = num * i;
			num = num % 100000;
		}
		System.out.println(num);
    }
}

答案:59375

for循环从1循环到2021,然后挨个相乘,最后取余10000即可


#D 格点

题目:

问题描述

如果一个点 ( x , y ) 的两维坐标都是整数,即 x ∈ Z 且 y ∈ Z ,则称这个点为一个格点。
如果一个点 ( x , y ) 的两维坐标都是正数,即 x > 0  且 y > 0  ,则称这个点在第一象限。
请问在第一象限的格点中,有多少个点 ( x , y ) 的两维坐标乘积不超过 2021 ,即 x ⋅ y ≤ 2021。
提示:建议使用计算机编程解决问题。

答案提交

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

代码:

import java.util.*;
 
public class Main
{
    public static void main(String args[])
    {
        int a=0;
		for (int i = 1; i <= 2021; i++) {
			for (int j = 1; j <=2021; j++) {
				if (i*j<=2021) {
					a++;
					
				}
			}
		}
		System.out.println(a);
    }
}

答案:15698

两个坐标,两个for循环,判断当x*y<=2021的时候 计次 输出


#E 整数分解

题目:

问题描述

将 3 分解成两个正整数的和,有两种分解方法,分别是 3 = 1 + 2 和 3 = 2 + 1 。注意顺序不同算不同的方法。
将 5 分解成三个正整数的和,有 6 种分解方法,它们是 1 + 1 + 3 = 1 + 2 + 2 = 1 + 3 + 1 = 2 + 1 + 2 = 2 + 2 + 1 = 3 + 1 + 1。
请问,将 2021 分解成五个正整数的和,有多少种分解方法?

答案提交

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

代码:

public class Test {

    public static void main(String[] args) {
        long[][] dp = new long[6][2022];
        java.util.Arrays.fill(dp[1], 1);
        for (int k = 2; k <= 5; k++)
            for (int i = k; i <= 2021; i++)
                dp[k][i] = dp[k][i - 1] + dp[k - 1][i - 1];
        System.out.println(dp[5][2021]);
    }
}

答案:691677274345

这个有个for循环但是需要等结果,时间特长


#F 3 的倍数

题目:

问题描述

小蓝对 3 33 的倍数很感兴趣。现在他手头有三个不同的数 a , b , c ,他想知道,这三个数中是不是有两个数的和是 3 的倍数。
例如,当 a = 3 , b = 4 , c = 6 时,可以找到 a aa 和 c cc 的和是 3 的倍数。
例如,当 a = 3 , b = 4 , c = 7 时,没办法找到两个数的和是 3 的倍数。

输入格式

输入三行,每行一个整数,分别表示 a , b , c a, b, ca,b,c。

输出格式

如果可以找到两个数的和是 3 33 的倍数,输出 y e s yesyes,否则输出 n o nono。

测试样例1
Input:
3
4
6

Output:
yes

测试样例2
Input:
3
4
7

Output:
no
评测用例规模与约定

对于所有评测用例,1 ≤ a ≤ b ≤ c ≤ 100 。

代码:

import java.util.*;
 
public class Main
{
    public static void main(String args[])
    {
        Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();
		int b = sc.nextInt();
		int c = sc.nextInt();
		for (int i = 1; i <= 1000; i++) {
			if ((a + b) % 3 == 0 || (a + c) % 3 == 0 || (b + c) % 3 == 0) {
				System.out.println("yes");
				break;
			} else {
				System.out.println("no");
				break;
			}
		}
    }
}

直接循环判断相加取余3等于0输出yes否则no 


#G 特殊年份

题目:

问题描述

今年是 2021 年,2021 这个数字非常特殊,它的千位和十位相等,个位比百位大 1 ,我们称满足这样条件的年份为特殊年份。
输入 5 个年份,请计算这里面有多少个特殊年份。

输入格式

输入 5  行,每行一个 4 位十进制数(数值范围为 1000 至 9999 ),表示一个年份。

输出格式

输出一个整数,表示输入的 5 个年份中有多少个特殊年份。

测试样例1
Input:
2019
2021
1920
2120
9899

Output:
2

Explanation:
2021 和 9899 是特殊年份,其它不是特殊年份。

代码:

import java.util.*;
 
public class Main
{
    public static void main(String args[])
    {
        //Scanner sc = new Scanner(System.in);
		// int count = 0;
		// for (int i = 0; i < 5; i++) {
		// char[] arr = sc.nextLine().toCharArray();
		// if (arr[0] == arr[2] && arr[3] - arr[1] == 1) {
		// count++;
		// }
		// }
		// System.out.println(count);

		Scanner sc = new Scanner(System.in);
		String[] year = new String[5];
		int count = 0;
		for (int i = 0; i < 5; i++) {
			year[i] = sc.nextLine();
		}
		for (int i = 0; i < year.length; i++) {
			int a = year[i].charAt(0);// 千位
			int b = year[i].charAt(1);// 百位
			int c = year[i].charAt(2);// 十位
			int d = year[i].charAt(3);// 个位
			if (a == c && d - b == 1) {
				count++;
			}
		}
		System.out.println(count);
    }
}

两种方式 哪个都可以 都是用数组判断下标 


#H 小平方

题目:

问题描述

小蓝发现,对于一个正整数 n 和一个小于 n 的正整数 v,将 v 平方后对 n 取余可能小于 n 的一半,也可能大于等于 n 的一半。
请问,在 1 到 n − 1 中,有多少个数平方后除以 n 的余数小于 n 的一半。
例如,当 n = 4 时,1 , 2 , 3 的平方除以 4 的余数都小于 4 的一半。
又如,当 n = 5 时,1 , 4 的平方除以 5 的余数都是 1 ,小于 5 的一半。而 2 , 3 的平方除以 5 的余数都是 4 ,大于等于 5 的一半。

输入格式

输入一行包含一个整数 n 。

输出格式

输出一个整数,表示满足条件的数的数量。

测试样例1
Input:
5

Output:
2
评测用例规模与约定

对于所有评测用例,1 ≤ n ≤ 10000 。

代码:

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        int n = new Scanner(System.in).nextInt();
        int ans = 0, mid = n + 1 >> 1;
        for (int i = 1; i < n; i++)
            if (i * i % n < mid) ans++;
        System.out.println(ans);
    }
}

#I 完全平方数

题目:

问题描述

一个整数 a 是一个完全平方数,是指它是某一个整数的平方,即存在一个整数 b ,使得 a = b^2 。
给定一个正整数 n ,请找到最小的正整数 x ,使得它们的乘积是一个完全平方数。

输入格式

输入一行包含一个正整数 n 。

输出格式

输出找到的最小的正整数 x 。

测试样例1
Input:
12

Output:
3
测试样例2
Input:
15

Output:
15
评测用例规模与约定

对于 30% 的评测用例,1 ≤ n ≤ 1000 ,答案不超过 1000 10001000。
对于 60% 的评测用例,1 ≤ n ≤ 10^8 ,答案不超过 10^8。
对于所有评测用例,1 ≤ n ≤ 1 0^12 ,答案不超过 10^12。

代码:

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        long n = new Scanner(System.in).nextLong(), x = 1;
        for (int k = 2, i, j; k <= n; k ++) {
            i = 0;
            while (n % k == 0) {
                n /= k;
                i++;
            }
            if (i > 0) {
                j = -i & i;
                if (i != 1 && i == j) continue;
                x *= Math.pow(k, (j << 1) - i);
            }
        }
        System.out.println(x);
    }
}

#J 负载均衡

题目:

测试样例1
Input:
2 6
5 5
1 1 5 3
2 2 2 6
3 1 2 3
4 1 6 1
5 1 3 3
6 1 3 4

Output:
2
-1
-1
1
-1
0

Explanation:
时刻 1,第 1 个任务被分配到第 1 台计算机,耗时为 5 ,这个任务时刻 6 会结束,占用计算机 1 的算力 3。
时刻 2,第 2 个任务需要的算力不足,所以分配失败了。
时刻 3,第 1 个计算机仍然正在计算第 1 个任务,剩余算力不足 3,所以失败。
时刻 4,第 1 个计算机仍然正在计算第 1 个任务,但剩余算力足够,分配后剩余算力 1。
时刻 5,第 1 个计算机仍然正在计算第 1, 4 个任务,剩余算力不足 4,失败。
时刻 6,第 1 个计算机仍然正在计算第 4 个任务,剩余算力足够,且恰好用完。

代码:

import java.util.Scanner;
 
public class Main {
 
	public static int[][] T = new int[10005][10005]; //T[i][j]存储的是i号计算机在时刻j还剩余多少算力
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();  //计算机台数
		int m = in.nextInt();  //要分配的任务数
		//输入每台计算机的算力
		for(int i = 1; i <= n; i++)
		{
			int cacl = in.nextInt();
			//初始化存放各计算机当前剩余算力的数组T
			for(int j = 1; j <= 5000; j++)
			{
				T[i][j] = cacl;
			}
		}
		//输入m次任务分配详情,并判断本次分配结果
		while(m-- > 0)
		{
			int ai = in.nextInt();  //时刻ai
			int bi = in.nextInt();  //分配给几号计算机
			int ci = in.nextInt();  //任务占用耗时
			int di = in.nextInt();  //任务消耗的算力
			if(T[bi][ai] < di)  //算力不够,无法分配,取消该次分配
			{
				System.out.println(-1);
				continue;
			}
			for(int j = ai; j < ai + ci; j++)  //占用时长为ci,消耗算力di
			{
				T[bi][j] -= di;
			}
			System.out.println(T[bi][ai]);
		}
		
		in.close();
	}
 
}

最后几道题有点难,总之加油吧!

  • 8
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
第十一届蓝桥杯省赛第二场java大学b真题共分为两道编程题和一道综合应用题,以下是真题及解析。 第一题是给定一个字符串,求出字符串中所有数字的总和。首先我们可以使用正则表达式来匹配字符串中的数字,然后将匹配到的数字累加起来即可。可以使用Java中的Pattern和Matcher类来实现正则匹配,具体代码如下: ```java import java.util.regex.*; public class Main { public static void main(String[] args) { String str = "abc123def456ghi789"; int sum = 0; Pattern pattern = Pattern.compile("\\d+"); Matcher matcher = pattern.matcher(str); while(matcher.find()) { sum += Integer.parseInt(matcher.group()); } System.out.println("数字总和为:" + sum); } } ``` 第二题是给定两个字符串,判断第二个字符串是否是第一个字符串的子串。可以使用Java中的contains()方法来判断一个字符串是否包含另一个字符串。具体代码如下: ```java public class Main { public static void main(String[] args) { String str1 = "abcdefg"; String str2 = "cde"; if (str1.contains(str2)) { System.out.println("第二个字符串是第一个字符串的子串!"); } else { System.out.println("第二个字符串不是第一个字符串的子串!"); } } } ``` 综合应用题是实现一个简单的计算器,根据输入的两个数字和运算符进行相应的运算并输出结果。我们可以使用Java中的Scanner类来获取用户输入的数字和运算符,并根据运算符进行相应的运算。具体代码如下: ```java import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入第一个数字:"); int num1 = scanner.nextInt(); System.out.print("请输入第二个数字:"); int num2 = scanner.nextInt(); System.out.print("请输入运算符(+、-、*、/):"); String operator = scanner.next(); double result = 0; switch(operator) { case "+": result = num1 + num2; break; case "-": result = num1 - num2; break; case "*": result = num1 * num2; break; case "/": result = num1 / num2; break; default: System.out.println("无效的运算符!"); } System.out.println("计算结果为:" + result); } } ``` 以上就是第十一届蓝桥杯省赛第二场java大学b真题及解析的回答,希望能对你有所帮助!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二两清酒.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值