C/C++编程(1~8级)全部真题・点这里
第1题:满足条件的数的累加2
现有n个整数,将其中个位数为k的数进行累加求和
输入
第一行一个整数n。第二行n个非负整数,以空格分割,每个数不大于100000。第三行一个整数k。
输出
输出满足题目要求的累加和
样例输入
10
2 5 7 17 11 18 4 27 1 7
7
样例输出
58
答案:
#include <stdio.h>
int main() {
int n, sum = 0;
scanf("%d", &n);
int a[n];
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
int k;
scanf("%d", &k);
for (int i = 0; i < n; i++) {
if (a[i] % 10 == k) {
sum += a[i];
}
}
printf("%d", sum);
return 0;
}
第2题:统一文件名
小A在命名文件的时候经常不注意大小写,格式比较混乱。现要求你写一个程序将目录下的文件统一规范的格式,即文件名的第一个字符如果是字母要大写,其他字母小写。如将Test、test整理成Test。
时间限制:1000
内存限制:65536
输入
第一行一个数字n,表示有n个文件名要统一,n不超过100。 接下来n行,每行一个单词,长度不超过20,表示文件的名字。文件名由字母、数字和-组成。
输出
n行,每行一个单词,对应统一后的文件名。
样例输入
4
Test
data
2-TEST
problem-6
样例输出
Test
Data
2-test
Problem-6
以下是使用C语言编写的解决方案,用于将给定的文件名统一规范化格式:
#include <stdio.h>
#include <ctype.h>
void normalizeFilename(char *filename) {
int length = strlen(filename);
// 将第一个字符转换为大写
if (isalpha(filename[0])) {
filename[0] = toupper(filename[0]);
}
// 将其余字符转换为小写
for (int i = 1; i < length; i++) {
filename[i] = tolower(filename[i]);
}
}
int main() {
int n;
scanf("%d", &n);
char filenames[n][21];
for (int i = 0; i < n; i++) {
scanf("%s", filenames[i]);
normalizeFilename(filenames[i]);
}
for (int i = 0; i < n; i++) {
printf("%s\n", filenames[i]);
}
return 0;
}
在此解决方案中,我们首先定义一个函数normalizeFilename
,用于将给定的文件名规范化为统一格式。
在函数中,我们首先获取文件名的长度。
然后,我们将文件名的第一个字符转换为大写,使用isalpha
函数检查字符是否为字母,使用toupper
函数将字符转换为大写。
接下来,我们使用循环结构,将文件名的其余字符转换为小写,使用tolower
函数将字符转换为小写。
在main
函数中,我们首先定义一个变量n
,用于存储文件名的个数。
然后,使用scanf
函数读取n
的值。
接下来,我们定义一个二维字符数组filenames
,大小为n
行,每行最多可以存储20个字符的文件名。
使用循环结构,我们遍历每个文件名,并使用scanf
函数将文件名读取到相应的行中。
接着,我们调用normalizeFilename
函数,将每个文件名规范化为统一格式。
最后,使用循环结构,我们遍历每个文件名,并使用printf
函数输出结果。每个文件名占一行。
编译并运行上述代码,根据给定的输入示例,将会输出统一规范化后的文件名。
第3题:Lab杯
“Lab杯”乒乓球赛就要在PKU的实验室之间举行了。人工智能实验室的学生都是乒乓球的狂热分子,都强烈希望代表实验室去比赛。但是由于名额限制,他们之中只能由一个人被选作代表。
为了让选择的过程公平,他们决定打一次单循环赛,每一对学生之间都打一场五局三胜的比赛。赢得最多比赛的人就将代表实验室去比赛。现在Ava手里有一份表,表里面记录了每一场比赛的比分。她应该让谁去比赛?
时间限制:5000
内存限制:131072
输入
输入包含一组测试数据。第一行包含n(2 ≤ n ≤ 100),实验室里学生的数目。接下来给出一个n × n矩阵A。矩阵的每一个元素都是0、1、2、3中的一个。第i行第j列的元素aij是第i个学生在和第j个学生的比赛中赢的局数。aij和aji(i ≠ j)正好有一个是3,另外一个小于3。矩阵的所有对角线元素都是0。
输出
输出赢了最多比赛的学生的编号。如果有平分,选择编号最小的。
样例输入
4
0 0 3 2
3 0 3 1
2 2 0 2
3 3 3 0
样例输出
4
答案:
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
int a[110][110];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &a[i][j]);
}
}
int max_score = 0;
int no = 1;
for (int i = 0; i < n; i++) {
int t = 0;
for (int j = 0; j < n; j++) {
t = t + a[i][j];
}
if (t > max_score) {
max_score = t;
no = i + 1;
}
}
printf("%d", no);
return 0;
}
第4题:整数排序
给定10个整数的序列,要求对其重新排序。排序要求:
1.奇数在前,偶数在后;
2.奇数按从大到小排序;
3.偶数按输入顺序逆序排序。
时间限制:1000
内存限制:65536
输入
输入一行,包含10个整数,彼此以一个空格分开,每个整数的范围是大于等于0,小于等于100。
输出
按照要求排序后输出一行,包含排序后的10个整数,数与数之间以一个空格分开。
样例输入
4 7 3 13 11 12 0 47 34 98
样例输出
47 13 11 7 3 98 34 0 12 4
答案:
#include <stdio.h>
int main() {
int a[11], b[11];
for (int i = 1; i <= 10; i++) {
scanf("%d", &a[i]);
b[i] = a[i];
}
for (int i = 1; i <= 10; i++) {
for (int j = i + 1; j <= 10; j++) {
if (a[i] > a[j]) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
for (int i = 10; i >= 1; i--) {
if (a[i] % 2 == 1) printf("%d ", a[i]);
}
for (int i = 10; i >= 1; i--) {
if (b[i] % 2 == 0) printf("%d ", b[i]);
}
return 0;
}
第5题:石头剪刀布
石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。
一天,小A和小B正好在玩石头剪刀布。已知他们的出拳都是有周期性规律的,比如:“石头-布-石头-剪刀-石头-布-石头-剪刀……”,就是以“石头-布-石头-剪刀”为周期不断循环的。请问,小A和小B比了N轮之后,谁赢的轮数多?
时间限制:1000
内存限制:65536
输入
输入包含三行。 第一行包含三个整数:N,NA,NB,分别表示比了N轮,小A出拳的周期长度,小B出拳的周期长度。0 < N,NA,NB < 100。 第二行包含NA个整数,表示小A出拳的规律。 第三行包含NB个整数,表示小B出拳的规律。 其中,0表示“石头”,2表示“剪刀”,5表示“布”。相邻两个整数之间用单个空格隔开。
输出
输出一行,如果小A赢的轮数多,输出A;如果小B赢的轮数多,输出B;如果两人打平,输出draw。
样例输入
10 3 4
0 2 5
0 5 0 2
样例输出
A
提示
对于测试数据,猜拳过程为: A:0 2 5 0 2 5 0 2 5 0 B:0 5 0 2 0 5 0 2 0 5 A赢了4轮,B赢了2轮,双方打平4轮,所以A赢的轮数多。
以下是使用C语言编写的解决方案,用于判断小A和小B在石头剪刀布游戏中谁赢得的轮数更多:
#include <stdio.h>
int main() {
int N, NA, NB;
scanf("%d %d %d", &N, &NA, &NB);
int A[100], B[100];
for (int i = 0; i < NA; i++) {
scanf("%d", &A[i]);
}
for (int i = 0; i < NB; i++) {
scanf("%d", &B[i]);
}
int countA = 0, countB = 0;
for (int i = 0; i < N; i++) {
int a = A[i % NA];
int b = B[i % NB];
if ((a == 0 && b == 2) || (a == 2 && b == 5) || (a == 5 && b == 0)) {
countA++;
} else if ((b == 0 && a == 2) || (b == 2 && a == 5) || (b == 5 && a == 0)) {
countB++;
}
}
if (countA > countB) {
printf("A\n");
} else if (countB > countA) {
printf("B\n");
} else {
printf("draw\n");
}
return 0;
}
在此解决方案中,我们首先使用scanf
函数读取输入的整数N、NA和NB,以及小A和小B出拳的规律。
然后,我们使用两个数组A
和B
分别存储小A和小B出拳的规律。接着,我们使用循环来模拟小A和小B进行猜拳的过程,并根据规则判断谁赢得了每一轮的比赛,并统计各自的胜利轮数。
最后,我们根据小A和小B的胜利轮数比较结果,使用printf
函数输出结果。
编译并运行上述代码,根据给定的输入示例,将会输出小A和小B在石头剪刀布游戏中谁赢得的轮数更多:
A