D、合并检测
本题总分:10 分
【问题描述】
最近存在A病,最近在 A 国蔓延,为了尽快控制病*,A 国准备给大量民众进病*检测。
然而,用于检测的试剂盒紧缺。
为了解决这一困难,科学家想了一个办法:合并检测。即将从多个人(k个)采集的标本放到同一个试剂盒中进行检测。如果结果为阴性,则说明这 k个人都是阴性,用一个试剂盒完成了 k 个人的检测。如果结果为阳性,则说明至少有一个人为阳性,需要将这 k 个人的样本全部重新独立检测(从理论上看,如果检测前 k 1 个人都是阴性可以推断出第 k 个人是阳性,但是在实际操作中不会利用此推断,而是将 k 个人独立检测),加上最开始的合并检测,一共使用了 k + 1 个试剂盒完成了 k 个人的检测。
A 国估计被测的民众的感染率大概是 1%,呈均匀分布。请问 k 取多少能最节省试剂盒?
【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
题解:
package action; public class demo { public static void main(String[] args) { int allPerson = 999;//人数 int num = 0; //试剂盒个数 int minx = 9999999; //试剂盒最少个数 int answer = 0; for (int k = 1; k <= allPerson; k++) { if (allPerson % k == 0) { num = (allPerson / k) + (int) Math.floor(0.01 * allPerson) * k; } else { num = (allPerson / k) + (int) Math.floor(0.01 * allPerson) * k + 1; } if (num < minx) { minx = num; answer = k; } } System.out.println(answer); } }
E、REPEAT 程序
本题总分:15 分
【问题描述】
附件 prog.txt 中是一个用某种语言写的程序。
其中 REPEAT k 表示一个次数为 k 的循环。循环控制的范围由缩进表达,
从次行开始连续的缩进比该行多的(前面的空白更长的)为循环包含的内容。
例如如下片段:
该片段中从A = A + 4 所在的行到 A = A + 8 所在的行都在第一行的循环两次中。
REPEAT 6: 所在的行到 A = A + 7 所在的行都在 REPEAT 5: 循环中。
A = A + 5 实际总共的循环次数是 2 × 5 × 6 = 60 次。
请问该程序执行完毕之后,A 的值是多少?
【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个
整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
题解:
package action; public class demo { public static void main(String[] args) { int A = 0; for (int i = 0; i < 2; i++) { A += 4; for (int j = 0; j < 5; j++) { for (int k = 0; k < 6; k++) { A += 5; } A += 7; } A += 8; } A += 9; System.out.println(A); } }
F、分类计数
本题总分:15 分
【问题描述】
输入一个字符串,请输出这个字符串包含多少个大写字母,多少个小写字母,多少个数字。
【输入格式】
输入一行包含一个字符串。
【输出格式】
输出三行,每行一个整数,分别表示大写字母、小写字母和数字的个数。
【样例输入】
1+a=Aab
【样例输出】
1
3
1
题解:
package action; import java.util.Scanner; public class demo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str = sc.next(); char[] ch = str.toCharArray(); int[] num = new int[3]; for (int i = 0; i < ch.length; i++) { if (ch[i] >= '0' && ch[i] <= '9') { num[2]++; } else if (ch[i] >= 'a' && ch[i] <= 'z') { num[1]++; } else if (ch[i] >= 'A' && ch[i] <= 'Z') { num[0]++; } } for (int i : num) { System.out.println(i); } } }
输入【1+a=Aab】
G、整除序列
【问题描述】
本题总分:15 分
有一个序列,序列的第一个数是 n,后面的每个数是前一个数整除 2,请输
出这个序列中值为正数的项。
【输入格式】
输入一行包含一个整数 n。
【输出格式】
输出一行,包含多个整数,相邻的整数之间用一个空格分隔,表示答案。
【样例输入】
20
【样例输出】
20 10 5 2 1
【评测用例规模与约定】
对于 80% 的评测用例,1 ≤ n ≤ 109。
对于所有评测用例,1 ≤ n ≤ 1018。
题解:
package action; import java.util.Scanner; public class demo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); while (n > 0) { System.out.print(n + " "); n /= 2; } } }