2021年第十二届蓝桥杯国赛javaB组
试题A: 整数范围
 试题B: 纯质数
 试题C: 完全日期
 试题D: 最小权值
 试题E: 大写
 试题F: 123
 试题G: 和与乘积
 试题H: 巧克力
 试题I: 翻转括号序列
 试题J: 异或三角
试题A: 整数范围
 本题总分:5 分
 【问题描述】
   用8位二进制(一个字节)来表示一个非负整数,表示的最小值是0,则一般能表示的最大值是多少?
【答案提交】
 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案:255
试题B: 纯质数
 本题总分:5 分
 【问题描述】
如果一个正整数只有1和它本身两个约数,则称为一个质数(又称素数)。
   前几个质数是:2,3,5,7,11,13,17,19,23,29,31,37…。
 
  如果一个质数的所有十进制数位都是质数,我们称它为纯质数。例如:2,3,5,7,23,37都是纯质数,而11,13,17,19,29,31不是纯质数。当然1,4,35也不是纯质数。
   请问,在1到20210605中,有多少个纯质数?
【答案提交】
 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案:1903
试题C: 完全日期
 本题总分:10 分
 【问题描述】
如果一个日期中年月日的各位数字之和是完全平方数,则称为一个完全日期。
   例如:2021年6月5日的各位数字之和为2 + 0 + 2 + 1 + 6 + 5 = 
16,而16是一个完全平方数,它是4的平方。所以2021年6月5日是一个完全日期。
   例如:2021年6月23日的各位数字之和为2 + 0 + 2 + 1 + 6 + 2 + 3 = 
16,是一个完全平方数。所以2021年6月23日也是一个完全日期。
   请问,从2001年1月1日到2021年12月31日中,一共有多少个完全日期?
【答案提交】
 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案:977
试题D: 最小权值
 本题总分:10 分
 【问题描述】
对于一棵有根二叉树T,小蓝定义这棵树中结点的权值W(T)如下:
   空子树的权值为0。
   如果一个结点v有左子树L,右子树R,分别有C(L)和C®个结点,则:
     W(v) = 1 + 2W(L) + 3W® +(C(L))2C®。
   树的权值定义为树的根结点的权值。
   小蓝想知道,对于一棵有2021个结点的二叉树,树的权值最小可能是多少?
【答案提交】
 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案:______
试题E: 大写
 时间限制: 1.0s  内存限制: 512.0MB  本题总分:15分
 【问题描述】
给定一个只包含大写字母和小写字母的字符串,请将其中所有的小写字母转换成大写字母后将字符串输出。
【输入格式】
 输入一行包含一个字符串
 【输出格式】
 输出转换成大写后的字符串。
 【样例输入1】
 LanQiao
 【样例输出1】
 LANQIAO
 【评测用例规模与约定】
 对于所有评测用例,字符串的长度不超过100。
方法一:使用java的String类自带的转换大小写的toUpperCase()方法。
import java.util.Scanner; public class Main { public static void main(String[] 
args) { Scanner input = new Scanner(System.in); String a = input.next(); String 
b= a.toUpperCase(); System.out.println(b); } } 
方法二:
import java.util.*; public class Main { public static void main(String[] args) 
{ Scanner input = new Scanner(System.in); String a = input.next(); String daxie=
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"; String xiaoxie="abcdefghijklmnopqrstuvwxyz"; int 
len=a.length(); for(int i=0;i<len;i++) { for(int j=0;j<26;j++) { if(a.charAt(i)
==daxie.charAt(j)) { System.out.print(daxie.charAt(j)); break; } else if(a.
charAt(i)==xiaoxie.charAt(j)) { System.out.print(daxie.charAt(j)); break; } } } 
} } 
试题F: 123
 时间限制: 5.0s   内存限制: 512.0MB   本题总分:15分
 【问题描述】
小蓝发现了一个有趣的数列,这个数列的前几项如下:
     1, 1, 2, 1, 2, 3, 1, 2, 3, 4, …
   小蓝发现,这个数列前1项是整数1,接下来2项是整数1至2,接下来3项是整数1至3,接下来4项是整数1至4,依次类推。
   小蓝想知道,这个数列中,连续一段的和是多少。
【输入格式】
 输入的第一行包含一个整数T,表示询问的个数。
 接下来T行,每行包含一组询问,其中第i行包含两个整数li和ri,表示询问数列中第li个数到第ri个数的和。
 【输出格式】
 输出T行,每行包含一个整数表示对应询问的答案。
 【样例输入】
 3
 1 1
 1 3
 5 8
 【样例输出】
 1
 4
 8
 【评测用例规模与约定】
只能拿到70%的分。。。。。。
import java.util.*; public class Main { public static void main(String[] args) 
{ Scanner input = new Scanner(System.in); int xunwencishu=input.nextInt(); int 
left[]=new int[xunwencishu]; int right[]=new int[xunwencishu]; int max=0;
//表示对该序列询问的最大长度,以该值确定序列的大致长度,当然应该也可以不用考虑这个。。 for(int i=0;i<xunwencishu;i++) { 
left[i]=input.nextInt(); if(left[i]>max) { max=left[i]; } right[i]=input.nextInt
(); if(right[i]>max) { max=right[i]; } } int xulie []=new int[max+1]; int index=
0; //根据题意,初始化序列。 for(int i=1;index<=max;i++) { for(int j=1;j<=i;j++) { if(index
<=max) xulie[index++]=j; } } for(int i=0;i<xunwencishu;i++) { int sum=0; for(int
 j=left[i]-1;j<=right[i]-1;j++) { sum+=xulie[j]; } System.out.println(sum); } } 
} 
试题G: 和与乘积
一种解法:
应该拿不了满分。。。。 import java.util.*; public class Main { public static void main(
String[] args) { public static void main(String[] args) { Scanner input = new 
Scanner(System.in); int n=input.nextInt(); int a[]=new int[n]; for(int i=0;i<n;i
++) { a[i]=input.nextInt(); } int count=0; int ji=1; int sum=0; for(int i=0;i<n;
i++) { ji=1; sum=0; for(int j=i;j<n;j++) { ji*=a[j]; sum+=a[j]; if(sum==ji) { 
count++; } } } System.out.println(count); } } 
待更。。。。