第十二届蓝桥杯大赛第四期模拟赛
A.填空题
请问在1900-2020中有多少个质数?
public class _A {
public static void main(String[] args) {
int ans = 0;
for (int i = 1900; i <= 2020; i++) {
if (i % 2 == 0) continue;
if (check(i)) {
//查看所有的质数
System.out.println(i);
//答案
ans++;
}
}
System.out.println(ans);
}
private static boolean check(int n) {
int sqrt = (int)Math.sqrt(n);
for (int i = 2; i <= sqrt; i++) {
if (n % i == 0) return false;
}
return true;
}
}
B.填空题
B.ASCII码
ASCII码将每个字符对应到一个数值(编码),用于信息的表示和传输。在ASCII码中,英文字母是按从小到大的顺序
依次编码的,例如:字母A编码是65,字母B编码是66,字母C编码是67,请编码为80的是哪个字母?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个英文字母,在提交答案时只填写这个英文字
母,填写多余的内容将无法得分。
代码实现
public class _B {
public static void main(String[] args) {
System.out.println((char) 80);
}
}
C.填空题
C.Fibonacci序列
问题描述
Fibonacci序列按照如下公式定义:
F[1] = 1
F[2] = 1
F[]= F[i-1] + F[i-2] (i>2)
前几个Fibonacci数为1,1,2,3, 5, 8, 13, 21。
请问,前100个Fibonacci数中,有多少个数是3的倍数?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写
多余的内容将无法得分。
tips:
因为到fib(44)左右时数据会超过 所以使用BigInteger。
res: 25
代码实现
public class _C {
public static void main(String[] args) {
int res = 0;
for (int i = 2; i <= 100; i++) {
BigInteger fibN = fibonacciNormal(i);
if (fibN.mod(BigInteger.valueOf(3)).compareTo(BigInteger.valueOf(0)) == 0) {
System.out.println(fibN);
res++;
}
}
System.out.println(res);
}
public static BigInteger fibonacciNormal(int n){
if (n == 1) {
return new BigInteger("0");
}
BigInteger n1 = new BigInteger("0"), n2 = new BigInteger("1"), sn = new BigInteger("0");
for (int i = 0; i < n - 1; i++) {
sn = n1.add(n2);
n1 = n2;
n2 = sn;
}
return sn;
}
}
D.填空题
D.二叉树
问题描述
有一棵二叉树,有2021个叶结点。
请问。这棵树至少有多少个结点?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写
多余的内容将无法得分。
res : 4041
代码实现
A.对任何一棵二叉树:度为0的结点数(即叶节点) = 度为2的节点数 + 1;
B.当二叉树的总个数为奇数时,此二叉树"没有度为1"的结点;
C.当二叉树的总个数为偶数时,此二叉树"只有一个度为1"的结点;
以上是二叉树的一些特征。
这里让我们求最少有多少个节点。
根据题目条件:
已知n0(度为0) = 2021;
根据特征A得:
n2 + 1 = 2021;
n2 = 2020;
根据特征B,C得:
nodes = 2020 + 2021; || nodes = 2020 + 2021 + 1;
这里前者显然更满足题意。
E.不知
E.身份证
不知
F1.小红买笔
F1.小红买笔
问题摧述
小蓝在商店买文具,
1支钢笔x元,小蓝买了a支
1个笔记本y元,小蓝买了b本。
请问,小蓝1共需要支付多少钱?
输入格式
输入四行,
第-行包含1个整数x。
第二行包含1个整数a,
第三行包含1个整数y.
第四行包含1个整数b,
输出格式
输出一个整数,表示答案
样例输入
5
2
1
6
样例输出
16
代码实现
public class _F {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int x = sc.nextInt(), a = sc.nextInt(), y = sc.nextInt(), b = sc.nextInt();
System.out.println(a*x+b*y);
}
}
F2.摩尔斯电码
F2.摩尔斯电码
小Hi的公司经常举办回馈社会的爱心活动。这次小Hi作为志愿者带领社区的孩子们参观了青少年天文馆。
他发现孩子们对于摩尔.斯电码非常感兴趣。
摩尔斯电码由两种基本的信号组成:短信号“滴"(用字符:表示)以及长信号"嗒"(用字符-表示)。
下图是数字0-9的摩尔斯电码表示,每个数字都由5个字符组成:
“-----”,".----","…—","…–","…-","…","-…","–…","—…","----."
为了让孩子们开心,小Hi决定把每位孩子的生日日期转化为摩尔斯码赠送给他们。例如日期20210101对应的摩尔斯电码是:
你能写一个程序帮助小Hi吗?
输入格式
第一行是一个整数N,代表参加活动的孩子的人数。(1 <= N
<= 100)
以下N行每行一个由0- 9组成的字符串,代表一个生日日期。 (日
期格式: yyyymmdd,日期范围: 20000101 至20210101)
2
20161011
20000101
输出格式
对于每个生日日期,输出- -行表示转化后的摩尔斯码,数字之间
用一个空格隔开。
…— ----- .---- -… .---- ----- .---- .----
…— ----- ----- ----- ----- .---- ----- .----
代码实现
public class _F2 {
public static void main(String[] args) {
String[] ms = {"-----",".----","..---","...--","....-",".....","-....","--...","---..","----."};
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String[] strs = new String[n];
for (int i = 0; i < n; i++) {
strs[i] = sc.next();
}
for (int i = 0; i < n; i++) {
char[] chs = strs[i].toCharArray();
for (int j = 0; j < chs.length; j++) {
if (j == chs.length - 1) {
System.out.println(ms[chs[j] - '0']);
}else {
System.out.print(ms[chs[j] - '0'] + " ");
}
}
}
}
}
G.程序设计
G.首字母大写
G题
输入一串字符,将首字母大写,后续字母小写
代码实现
public class _G{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
char[] a = s.toCharArray();
if(a[0] >= 'a' && a[0] <= 'z') a[0] -= 32; //先把首字母处理了
for(int i = 1; i < a.length;i++){ //再处理后续字母
if(a[i] >= 'A' && a[i] <= 'Z') a[i] += 32;
}
for (char c : a) {
System.out.print(c);
}
}
}
H.递增三元组
H.递增三元组
给定一个序列(a_1,a_2… n), 定义序列中的一个递增三
元组是指三个下标i,j, k对应的三个元素a_i,a_j,a_k,这三个元素满足a_i<a_j<a_k.
例如序列(1,1,4,3,2,4)有以下4个递增三元组:
1.下标1,4,6对应的1,3,4;
2.下标1,5,6对应的1,2,4;
3.下标2,4,6对应的1,3,4;
4.下标2,5,6对应的1,2,4。
注意,可能有下标不同但对应数值相同的三元组,他们应当算成不同的三元组。
给定序列,请问序列中-共有多少个不同的递增三元组。
输出格式
输出一行,包含1个整数, 表示序列中的递增三元组数量。
请注意答案可能很大,可能超过32位二进制整数的范围,建议使用64位二进制整数。
样例输入
6
1 1 4 3 2 4
样例输出
4
数据规模和约定
对于30%的评测用例,1 <=n<= 20,0<=a i<= 10.
对于50%的评测用例,1 <=n<= 1000,0 <=a i<=100.
对于80%的评测用例,1 <=n <= 10000,0<=a i <=100.
对于所有评测用例,1 <=n <= 100000,0<=a i <=100.
代码实现
public class _H {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) a[i] = sc.nextInt();
int p = 0; long res = 0;
for (int i = 1; i < n - 1; i++) {
if (a[p] < a[i] && p < (n - 2)) {
for (int q = i + 1; q < n; q++) {
if (a[q] > a[i]) {
res += f(p, i, a);
}
}
}
}
System.out.println(res);
}
public static long f(int p, int i, int[] a) {
long res = 0;
while (p < i) {
if (a[p] < a[i]) {
res++;
}
p++;
}
return res;
}
}
I J还没做。
I.特殊栈
问题描述
小Hi正在研究1种特殊的栈。这种栈的元素既可以从栈顶出
栈,也可以从栈底出栈。(进栈还是只能从栈顶进栈)
已知入栈的序列是1~N的一个排列,请你判断出栈序列能否
是1,2,3,… N?
输入格式
输入包含多组数据。
输入第一行包含一个整数T, 代表测试数据的组数。
以下每组数据占据2行。
第一行包含一个整数N。
第二行包含N个整数,整数中由空格隔开。表示入栈序列。
输出格式
对于每组数据输出YES或者NO,代表出栈序列能否是1, 2, 3… N.
样例输入
2
5
24135
5
43152
样例输出
YES
NO
数据规模和约定
对于30%的评测用例,1 <= N <= 10
对于80%的评测用例,1 <= N <= 10000
对于所有评测用例,1 <= N <= 100000,1 <= T <=10。
代码实现
参考至:
https://newcoder-glm.blog.csdn.net/article/details/115298195
public class _I {
//其实这里开十个就够了 无所谓
static int[] arr = new int[20];
static int index = 0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for (int i = 0; i < T; i++) {
int N = sc.nextInt();
int[] a = new int[N];
for (int j = 0; j < N; j++) a[j] = sc.nextInt();
//创建一个队列
Deque<Integer> deque = new ArrayDeque<>();
int p = 1;
for (int j = 0; j < N; j++) {
deque.add(a[j]);
if (a[j] == p) {
deque.pollLast();
p++;
}
while (!deque.isEmpty() && p == deque.peekFirst()) {
deque.pollFirst();
p++;
}
while (!deque.isEmpty() && p == deque.peekLast()) {
deque.pollLast();
p++;
}
}
if (p == N + 1) arr[index++] = 1;
}
for (int i = 0; i < T; i++) {
if (arr[i] == 1) System.out.println(true);
else System.out.println(false);
}
}
}