2024第二次随堂测验参考答案
7-1 大笨钟的心情
有网友问:未来还会有更多大笨钟题吗?笨钟回复说:看心情……
本题就请你替大笨钟写一个程序,根据心情自动输出回答。
输入格式:
输入在一行中给出 24 个 [0, 100] 区间内的整数,依次代表大笨钟在一天 24 小时中,每个小时的心情指数。
随后若干行,每行给出一个 [0, 23] 之间的整数,代表网友询问笨钟这个问题的时间点。当出现非法的时间点时,表示输入结束,这个非法输入不要处理。题目保证至少有 1 次询问。
输出格式:
对每一次提问,如果当时笨钟的心情指数大于 50,就在一行中输出 心情指数 Yes
,否则输出 心情指数 No
。
输入样例:
80 75 60 50 20 20 20 20 55 62 66 51 42 33 47 58 67 52 41 20 35 49 50 63
17
7
3
15
-1
输出样例:
52 Yes
20 No
50 No
58 Yes
参考答案:
#include<stdio.h>
int main(){
int mood_index[30];
for (int i = 0; i < 24; i++) {
scanf("%d", &mood_index[i]);
}
int x;
scanf("%d", &x);
while(x >= 0 && x <= 23) {
if (mood_index[x] > 50) {
printf("%d Yes\n", mood_index[x]);
}else {
printf("%d No\n", mood_index[x]);
}
scanf("%d", &x);
}
return 0;
}
7-2 小孩子才做选择,大人全都要
阿汪面前有两只盲盒,每只盒子打开都有两种可能:或者装了 X 克狗粮,或者是一只容量为 Y 克的狗粮储蓄盒。如果是狗粮,阿汪可以快乐地吃掉;如果是空储蓄盒,那就倒霉了,阿汪必须想办法找到狗粮把这只储蓄盒装满,自己还吃不到。
正当阿汪发愁不知道该怎么选的时候,铲屎官大手一挥:“小孩子才做选择,大人全都要!”但全都要的结果,却不一定是赚了还是亏了……
我们假设聪明的阿汪总是能嗅出狗粮最多的盒子,并且绝不会选任何储蓄盒。而铲屎官没有这样的鼻子,他一定是全都要。铲屎官如果打开了有储蓄盒的盒子,就必须想办法把储蓄盒装满,他会优先用另一只盒子里的狗粮装(如果另外一只盒子里有狗粮),不够了还得自己去买新的狗粮,这样阿汪可就亏啦,什么都吃不到了。本题就请你判断阿汪到底是赚了还是亏了。
输入格式:
输入在一行中给出两个整数,绝对值都不超过 100,中间用一个空格分开,分别代表两只盒子里的东西。如果是正数就表示是狗粮的份量,如果是负数就表示绝对值是空盆的容量。两个数都肯定不是 0,因为保证没有空盒子。
输出格式:
第一行输出两个结果:如果让阿汪选能吃到的狗粮 A,和如果铲屎官全都要能吃到的狗粮 B。两个数字间用一个空格分开。如果铲屎官的决定让阿汪赚到了,就在第二行输出一个笑脸 ^_^
,否则输出一个哭脸 T_T
。但如果反正什么都吃不到(两个盒子里都没有狗粮),就输出一张躺平脸 -_-
。
输入样例 1:
12 18
输出样例 1:
18 30
^_^
输入样例 2:
12 -18
输出样例 2:
12 0
T_T
参考答案:
#include<stdio.h>
int main(){
int box1, box2;
scanf("%d %d", &box1, &box2);
if (box1 < 0 && box2 < 0) {
printf("0 0\n");
printf("-_-");
}else if (box1 < 0 || box2 < 0) {
printf("%d ", box1>box2?box1:box2);
int sum = box1 + box2;
if (sum <= 0) {
printf("0\n");
printf("T_T");
}else {
printf("%d\n", sum);
printf("T_T");
}
}else {
printf("%d %d\n", box1>box2?box1:box2, box1+box2);
printf("^_^");
}
return 0;
}
7-3 谁能进图书馆
为了保障安静的阅读环境,有些公共图书馆对儿童入馆做出了限制。例如“12 岁以下儿童禁止入馆,除非有 18 岁以上(包括 18 岁)的成人陪同”。现在有两位小/大朋友跑来问你,他们能不能进去?请你写个程序自动给他们一个回复。
输入格式:
输入在一行中给出 4 个整数:
禁入年龄线 陪同年龄线 询问者1的年龄 询问者2的年龄
这里的禁入年龄线
是指严格小于该年龄的儿童禁止入馆;陪同年龄线
是指大于等于该年龄的人士可以陪同儿童入馆。默认两个询问者的编号依次分别为 1
和 2
;年龄和年龄线都是 [1, 200] 区间内的整数,并且保证 陪同年龄线
严格大于 禁入年龄线
。
输出格式:
在一行中输出对两位询问者的回答,如果可以进就输出 年龄-Y
,否则输出 年龄-N
,中间空 1 格,行首尾不得有多余空格。
在第二行根据两个询问者的情况输出一句话:
- 如果两个人必须一起进,则输出
qing X zhao gu hao Y
,其中X
是陪同人的编号,Y
是小孩子的编号; - 如果两个人都可以进但不是必须一起的,则输出
huan ying ru guan
; - 如果两个人都进不去,则输出
zhang da zai lai ba
; - 如果一个人能进一个不能,则输出
X: huan ying ru guan
,其中X
是可以入馆的那个人的编号。
输入样例 1:
12 18 18 8
输出样例 1:
18-Y 8-Y
qing 1 zhao gu hao 2
输入样例 2:
12 18 10 15
输出样例 2:
10-N 15-Y
2: huan ying ru guan
参考答案:
#include<stdio.h>
int main(){
int min, max, a, b;
scanf("%d %d %d %d", &min, &max, &a, &b);
if (a >= min && b >= min) {
printf("%d-Y %d-Y\n", a, b);
printf("huan ying ru guan");
}
if (a < min && b < min) {
printf("%d-N %d-N\n", a, b);
printf("zhang da zai lai ba");
}
if (a >= max && b < min) {
printf("%d-Y %d-Y\n", a, b);
printf("qing 1 zhao gu hao 2");
}
if (a < min && b >= max) {
printf("%d-Y %d-Y\n", a, b);
printf("qing 2 zhao gu hao 1");
}
if (a >= min && a < max && b < min) {
printf("%d-Y %d-N\n", a, b);
printf("1: huan ying ru guan");
}
if (a < min && b >= min && b < max) {
printf("%d-N %d-Y\n", a, b);
printf("2: huan ying ru guan");
}
return 0;
}
7-4 程序员买包子
这是一条检测真正程序员的段子:假如你被家人要求下班顺路买十只包子,如果看到卖西瓜的,买一只。那么你会在什么情况下只买一只包子回家?
本题要求你考虑这个段子的通用版:假如你被要求下班顺路买 N 只包子,如果看到卖 X 的,买 M 只。那么如果你最后买了 K 只包子回家,说明你看到卖 X 的没有呢?
输入格式:
输入在一行中顺序给出题面中的 N、X、M、K,以空格分隔。其中 N、M 和 K 为不超过 1000 的正整数,X 是一个长度不超过 10 的、仅由小写英文字母组成的字符串。题目保证 N=M。
输出格式:
在一行中输出结论,格式为:
- 如果 K=N,输出
mei you mai X de
; - 如果 K=M,输出
kan dao le mai X de
; - 否则输出
wang le zhao mai X de
.
其中X
是输入中给定的字符串 X。
输入样例 1:
10 xigua 1 10
输出样例 1:
mei you mai xigua de
输入样例 2:
10 huanggua 1 1
输出样例 2:
kan dao le mai huanggua de
输入样例 3:
10 shagua 1 250
输出样例 3:
wang le zhao mai shagua de
参考答案:
#include <stdio.h>
int main(){
int n, m, k;
char x[20];
scanf("%d %s %d %d", &n, &x, &m, &k);
if (k == n) printf("mei you mai %s de", x);
else if (k == m) printf("kan dao le mai %s de", x);
else printf("wang le zhao mai %s de", x);
return 0;
}
7-5 进化论
在“一年一度喜剧大赛”上有一部作品《进化论》,讲的是动物园两只猩猩进化的故事。猩猩吕严说自己已经进化了 9 年了,因为“三年又三年”。猩猩土豆指出“三年又三年是六年呐”……
本题给定两个数字,以及用这两个数字计算的结果,要求你根据结果判断,这是吕严算出来的,还是土豆算出来的。
输入格式:
输入第一行给出一个正整数 N,随后 N 行,每行给出三个正整数 A、B 和 C。其中 C 不超过 10000,其他三个数字都不超过 100。
输出格式:
对每一行给出的三个数,如果 C 是 A×B,就在一行中输出 Lv Yan
;如果是 A+B,就在一行中输出 Tu Dou
;如果都不是,就在一行中输出 zhe du shi sha ya!
。
输入样例:
3
3 3 9
3 3 6
3 3 12
输出样例:
Lv Yan
Tu Dou
zhe du shi sha ya!
参考答案:
#include<stdio.h>
int main(){
int n;
scanf("%d", &n);
while(n--) {
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
if (c == a*b) printf("Lv Yan\n");
else if (c == a+b) printf("Tu Dou\n");
else printf("zhe du shi sha ya!\n");
}
return 0;
}
7-6 三角形判断
给定平面上任意三个点的坐标(x1,y1)、(x2,y2)、(x3,y3),检验它们能否构成三角形。
输入格式:
输入在一行中顺序给出六个[−100,100]范围内的数字,即三个点的坐标x1、y1、x2、y2、x3、y3。
输出格式:
若这3个点不能构成三角形,则在一行中输出“Impossible”;若可以,则在一行中输出该三角形的周长和面积,格式为“L = 周长, A = 面积”,输出到小数点后2位。
输入样例1:
4 5 6 9 7 8
输出样例1:
L = 10.13, A = 3.00
输入样例2:
4 6 8 12 12 18
输出样例2:
Impossible
参考答案:
#include <stdio.h>
#include <math.h>
int main(){
double x1, y1, x2, y2, x3, y3;
scanf("%lf %lf %lf %lf %lf %lf", &x1, &y1, &x2, &y2, &x3, &y3);
double a = sqrt(pow(x2-x1, 2) + pow(y2-y1, 2));
double b = sqrt(pow(x3-x1, 2) + pow(y3-y1, 2));
double c = sqrt(pow(x3-x2, 2) + pow(y3-y2, 2));
if ((a+b > c) && (a+c > b) && (b+c > a)) {
double L = a + b + c;
double p = L/2;
double A = sqrt(p * (p-a) * (p-b) * (p-c));
printf("L = %.2f, A = %.2f", L, A);
}else {
printf("Impossible");
}
return 0;
}
7-7 计算天数
本题要求编写程序计算某年某月某日是该年中的第几天。
输入格式:
输入在一行中按照格式“yyyy/mm/dd”(即“年/月/日”)给出日期。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。闰年的2月有29天。
输出格式:
在一行输出日期是该年中的第几天。
输入样例1:
2009/03/02
输出样例1:
61
输入样例2:
2000/03/02
输出样例2:
62
参考答案:
#include<stdio.h>
int common_year[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int leap_year[] = {0,31,29,31,30,31,30,31,31,30,31,30,31};
int main(){
int year,month,day;
scanf("%d/%d/%d",&year,&month,&day);
int ans = 0;
if (year%400 == 0 || (year%4 == 0 && year%100 != 0)) {
for (int i = 0; i < month; i++) {
ans += leap_year[i];
}
ans += day;
}else {
for (int i = 0; i < month; i++) {
ans += common_year[i];
}
ans += day;
}
printf("%d",ans);
return 0;
}
7-8 龟兔赛跑
乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?
输入格式:
输入在一行中给出比赛时间T(分钟)。
输出格式:
在一行中输出比赛的结果:乌龟赢输出@_@
,兔子赢输出^_^
,平局则输出-_-
;后跟1空格,再输出胜利者跑完的距离(平局输出乌龟或兔子跑完的距离均可)。
输入样例:
242
输出样例:
@_@ 726
参考答案:
#include<stdio.h>
int main(){
int T;
scanf("%d", &T);
int v_turtle = 3;
int v_rabbit = 9;
int s_turtle = T * v_turtle;
int s_rabbit = 0;
for (int i = 0; i < T; i++) {
int temp = i % 90;
if ((temp >= 0 && temp < 10) || (temp >= 40 && temp < 50) || (temp >= 80 && temp < 90)) {
s_rabbit += v_rabbit;
}
}
if (s_rabbit == s_turtle) printf("-_- %d", s_rabbit);
if (s_rabbit > s_turtle) printf("^_^ %d", s_rabbit);
if (s_rabbit < s_turtle) printf("@_@ %d", s_turtle);
return 0;
}
7-9 天梯赛的善良
天梯赛是个善良的比赛。善良的命题组希望将题目难度控制在一个范围内,使得每个参赛的学生都有能做出来的题目,并且最厉害的学生也要非常努力才有可能得到高分。
于是命题组首先将编程能力划分成了 106 个等级(太疯狂了,这是假的),然后调查了每个参赛学生的编程能力。现在请你写个程序找出所有参赛学生的最小和最大能力值,给命题组作为出题的参考。
输入格式:
输入在第一行中给出一个正整数 N(≤2×104),即参赛学生的总数。随后一行给出 N 个不超过 106 的正整数,是参赛学生的能力值。
输出格式:
第一行输出所有参赛学生的最小能力值,以及具有这个能力值的学生人数。第二行输出所有参赛学生的最大能力值,以及具有这个能力值的学生人数。同行数字间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
10
86 75 233 888 666 75 886 888 75 666
输出样例:
75 3
888 2
参考答案:
#include<stdio.h>
int main(){
int n;
scanf("%d", &n);
int cnt_ability[1000010] = {0};
int min = 1e6+10, max = -1, cnt_min = 0, cnt_max = 0;
for (int i = 0; i < n; i++) {
int num;
scanf("%d", &num);
cnt_ability[num]++;
if (num <= min) {
min = num;
cnt_min = cnt_ability[num];
}
if (num >= max) {
max = num;
cnt_max = cnt_ability[num];
}
}
printf("%d %d\n%d %d", min, cnt_min, max, cnt_max);
return 0;
}
7-10 猴子吃桃问题
一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第N天早上想再吃时,见只剩下一个桃子了。问:第一天共摘了多少个桃子?
输入格式:
输入在一行中给出正整数N(1<N≤10)。
输出格式:
在一行中输出第一天共摘了多少个桃子。
输入样例:
3
输出样例:
10
参考答案:
#include<stdio.h>
int main(){
int n;
scanf("%d", &n);
int ans = 1;
for (int i = 2; i <= n; i++) {
ans = (ans+1) * 2;
}
printf("%d", ans);
return 0;
}
7-11 兔子繁衍问题
一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?
输入格式:
输入在一行中给出一个不超过10000的正整数N。
输出格式:
在一行中输出兔子总数达到N最少需要的月数。
输入样例:
30
输出样例:
9
参考答案:
#include<stdio.h>
int main(){
int n;
scanf("%d", &n);
int num[999] = {0};
num[1] = 1;
num[2] = 1;
int ans;
if (n == 1) ans = 1;
else {
for (int i = 3; ; i++) {
num[i] = num[i-1] + num[i-2];
if (num[i] >= n) {
ans = i;
break;
}
}
}
printf("%d", ans);
return 0;
}
7-12 寻找250
对方不想和你说话,并向你扔了一串数…… 而你必须从这一串数字中找到“250”这个高大上的感人数字。
输入格式:
输入在一行中给出不知道多少个绝对值不超过1000的整数,其中保证至少存在一个“250”。
输出格式:
在一行中输出第一次出现的“250”是对方扔过来的第几个数字(计数从1开始)。题目保证输出的数字在整型范围内。
输入样例:
888 666 123 -233 250 13 250 -222
输出样例:
5
参考答案:
#include <stdio.h>
int main()
{
int cnt=1;
while (1){
int x;
scanf("%d", &x);
if (x == 250) break;
cnt++;
}
printf("%d", cnt);
return 0;
}
7-13 打印沙漏
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
*****
***
*
***
*****
2
参考答案:
#include<stdio.h>
#include<math.h>
int main(){
int n;
char c;
scanf("%d %c",&n,&c);
int m=sqrt((n+1)/2);
for(int i = 1;i <= m; i++){
for(int j = 0; j < i-1; j++){
printf(" ");
}
for(int j = 1; j <= 2*m-2*i+1; j++){
printf("%c",c);
}
printf("\n");
}
for(int i = 1; i <= m-1; i++){
for(int j = 1; j <= m-i-1; j++){
printf(" ");
}
for(int j = 1; j <= 2*(i+1)-1; j++){
printf("%c",c);
}
printf("\n");
}
printf("%d",n-2*m*m+1);
return 0;
}
7-14 验证“哥德巴赫猜想”
数学领域著名的“哥德巴赫猜想”的大致意思是:任何一个大于2的偶数总能表示为两个素数之和。比如:24=5+19,其中5和19都是素数。本实验的任务是设计一个程序,验证20亿以内的偶数都可以分解成两个素数之和。
输入格式:
输入在一行中给出一个(2, 2 000 000 000]范围内的偶数N。
输出格式:
在一行中按照格式“N = p + q”输出N的素数分解,其中p ≤ q均为素数。又因为这样的分解不唯一(例如24还可以分解为7+17),要求必须输出所有解中p最小的解。
输入样例:
24
输出样例:
24 = 5 + 19
参考答案:
#include<stdio.h>
#include <stdbool.h>
bool isPrime(int x) {
bool flag = true;
if (x == 1) flag = false;
if (x == 2) flag = true;
if (x > 2) {
for (int i = 2; i <= sqrt(x); i++) {
if (x%i == 0) {
flag = false;
break;
}
}
}
return flag;
}
int main(){
int n;
scanf("%d",&n);
for(int i = 2; i <= n; i++) {
if (isPrime(i) == true && isPrime(n-i) == true) {
printf("%d = %d + %d",n,i,n-i);
break;
}
}
return 0;
}
7-15 梅森数
形如2n−1的素数称为梅森数(Mersenne Number)。例如22−1=3、23−1=7都是梅森数。1722年,双目失明的瑞士数学大师欧拉证明了231−1=2147483647是一个素数,堪称当时世界上“已知最大素数”的一个记录。
本题要求编写程序,对任一正整数n(n<20),输出所有不超过2n−1的梅森数。
输入格式:
输入在一行中给出正整数n(n<20)。
输出格式:
按从小到大的顺序输出所有不超过2n−1的梅森数,每行一个。如果完全没有,则输出“None”。
输入样例:
6
输出样例:
3
7
31
参考答案:
#include<stdio.h>
#include <stdbool.h>
bool isPrime(int x) {
bool flag = true;
if (x == 1) flag = false;
if (x == 2) flag = true;
if (x > 2) {
for (int i = 2; i <= sqrt(x); i++) {
if (x%i == 0) {
flag = false;
break;
}
}
}
return flag;
}
int main(){
int n;
scanf("%d", &n);
int flag = 0;
for (int i = 1; i <= n; i++) {
int num = pow(2, i) - 1;
if (isPrime(num) == true) {
flag = 1;
printf("%d\n", num);
}
}
if (flag == 0) printf("None");
return 0;
}
7-16 求n以内最大的k个素数以及它们的和
本题要求计算并输出不超过n的最大的k个素数以及它们的和。
输入格式:
输入在一行中给出n(10≤n≤10000)和k(1≤k≤10)的值。
输出格式:
在一行中按下列格式输出:
素数1+素数2+…+素数k=总和值
其中素数按递减顺序输出。若n以内不够k个素数,则按实际个数输出。
输入样例1:
1000 10
输出样例1:
997+991+983+977+971+967+953+947+941+937=9664
输入样例2:
12 6
输出样例2:
11+7+5+3+2=28
参考答案:
#include<stdio.h>
#include <stdbool.h>
bool isPrime(int x) {
bool flag = true;
if (x == 1) flag = false;
if (x == 2) flag = true;
if (x > 2) {
for (int i = 2; i <= sqrt(x); i++) {
if (x%i == 0) {
flag = false;
break;
}
}
}
return flag;
}
int main(){
int n, k;
scanf("%d %d", &n, &k);
int sum = 0;
int flag = 0;
for (int i = n; i >= 1; i--) {
if (isPrime(i) == true) {
if (flag == 1) printf("+");
printf("%d", i);
flag = 1;
k--;
sum += i;
}
if (k == 0) break;
}
printf("=%d", sum);
return 0;
}