第1题:石头剪刀布
石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。
一天,小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
第2题:谁考了第k名
在一次考试中,每个学生的成绩都不相同,现知道了每个学生的学号和成绩,求考第k名学生的学号和成绩。
时间限制:1000
内存限制:65536
输入
第一行有两个整数,分别是学生的人数n(1≤n≤100),和求第k名学生的k(1≤k≤n)。 其后有n行数据,每行包括一个学号(整数)和一个成绩(浮点数),中间用一个空格分隔。
输出
输出第k名学生的学号和成绩,中间用空格分隔。(注:请用%g输出成绩)
样例输入
5 3
90788001 67.8
90788002 90.3
90788003 61
90788004 68.4
90788005 73.9
样例输出
90788004 68.4
以下是使用C语言编写的解决方案,用于找出考试中第k名学生的学号和成绩:
#include <stdio.h>
typedef struct {
int studentID;
float score;
} Student;
int main() {
int n, k;
scanf("%d %d", &n, &k);
Student students[100];
for (int i = 0; i < n; i++) {
scanf("%d %f", &students[i].studentID, &students[i].score);
}
// 使用冒泡排序对学生按成绩进行降序排序
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (students[j].score < students[j + 1].score) {
Student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
printf("%d %g\n", students[k - 1].studentID, students[k - 1].score);
return 0;
}
在此解决方案中,我们首先使用scanf
函数读取输入的学生人数n和要求的第k名学生k。
然后,我们定义了一个名为Student
的结构体,它包含学号和成绩两个字段。接着,我们定义了一个学生数组students
,用于存储每个学生的信息。
接下来,我们使用一个循环读取每个学生的学号和成绩,并将其存储在students
数组中。
然后,我们使用冒泡排序算法对学生数组按成绩进行降序排序,以便找出第k名学生。
最后,我们使用printf
函数输出第k名学生的学号和成绩。
编译并运行上述代码,根据给定的输入示例,将会输出考试中第k名学生的学号和成绩:
90788004 68.4
第3题:计算鞍点
给定一个5*5的矩阵,每行只有一个最大值,每列只有一个最小值,寻找这个矩阵的鞍点。 鞍点指的是矩阵中的一个元素,它是所在行的最大值,并且是所在列的最小值。 例如:在下面的例子中(第4行第1列的元素就是鞍点,值为8 )。
11 3 5 6 9
12 4 7 8 10
10 5 6 9 11
8 6 4 7 2
15 10 11 20 25
时间限制:1000
内存限制:65536
输入
输入包含一个5行5列的矩阵
输出
如果存在鞍点,输出鞍点所在的行、列及其值,如果不存在,输出"not found"
样例输入
11 3 5 6 9
12 4 7 8 10
10 5 6 9 11
8 6 4 7 2
15 10 11 20 25
样例输出
4 1 8
以下是使用C语言编写的解决方案,用于找出给定矩阵的鞍点:
#include <stdio.h>
int main() {
int matrix[5][5];
// 读取矩阵输入
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
scanf("%d", &matrix[i][j]);
}
}
int saddleRow = -1, saddleCol = -1;
int foundSaddle = 0;
// 遍历每一行
for (int i = 0; i < 5; i++) {
int maxInRow = matrix[i][0];
int colIndex = 0;
// 找到当前行的最大值和对应的列索引
for (int j = 1; j < 5; j++) {
if (matrix[i][j] > maxInRow) {
maxInRow = matrix[i][j];
colIndex = j;
}
}
// 检查最大值是否为所在列的最小值
int isSaddle = 1;
for (int k = 0; k < 5; k++) {
if (matrix[k][colIndex] < maxInRow) {
isSaddle = 0;
break;
}
}
// 如果是鞍点,则记录行、列和值,并标记为已找到
if (isSaddle) {
saddleRow = i + 1;
saddleCol = colIndex + 1;
foundSaddle = 1;
break;
}
}
// 输出结果
if (foundSaddle) {
printf("%d %d %d\n", saddleRow, saddleCol, matrix[saddleRow - 1][saddleCol - 1]);
} else {
printf("not found\n");
}
return 0;
}
在此解决方案中,我们首先定义一个5x5的整数矩阵matrix
,用于存储输入的矩阵数据。
然后,我们使用嵌套的循环结构读取输入矩阵的每个元素,并将其存储在matrix
中。
接下来,我们使用两个循环嵌套遍历矩阵的每一行,找到每行的最大值及其对应的列索引。
然后,我们检查最大值是否为所在列的最小值。如果是,我们将记录鞍点的行、列和值,并将foundSaddle
标记为1,表示已找到鞍点。
最后,根据foundSaddle
的值,我们使用printf
函数输出鞍点的行、列和值,或输出"not found"。
编译并运行上述代码,根据给定的输入示例,将会输出给定矩阵的鞍点:
4 1 8
第4题:合法 C 标识符
给定一个不包含空白符的字符串,请判断是否是C语言合法的标识符号(注:题目保证这些字符串一定不是C语言的保留字)。
C语言标识符要求:
1.非保留字;
2.只包含字母、数字及下划线(“_”)。
3.不以数字开头。
时间限制:1000
内存限制:65536
输入
一行,包含一个字符串,字符串中不包含任何空白字符,且长度不大于20。
输出
一行,如果它是C语言的合法标识符,则输出yes,否则输出no。
样例输入
RKPEGX9R;TWyYcp
样例输出
no
以下是使用C语言编写的解决方案,用于判断给定的字符串是否是C语言合法的标识符:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int isValidIdentifier(const char *str) {
int length = strlen(str);
// 检查长度是否超过20个字符
if (length > 20) {
return 0;
}
// 检查是否以数字开头
if (isdigit(str[0])) {
return 0;
}
// 检查每个字符是否合法
for (int i = 0; i < length; i++) {
if (!(isalnum(str[i]) || str[i] == '_')) {
return 0;
}
}
return 1;
}
int main() {
char str[21];
scanf("%s", str);
if (isValidIdentifier(str)) {
printf("yes\n");
} else {
printf("no\n");
}
return 0;
}
在此解决方案中,我们首先定义了一个名为isValidIdentifier
的函数,用于判断给定字符串是否是合法的C语言标识符。
在该函数中,我们首先获取字符串的长度,并检查长度是否超过20个字符。如果超过,我们返回0表示不合法。
接下来,我们检查字符串是否以数字开头。如果是,我们返回0表示不合法。
然后,我们遍历字符串的每个字符,检查是否是字母、数字或下划线。如果不是,我们返回0表示不合法。
最后,如果字符串通过了上述所有条件的检查,我们返回1表示合法。
在main
函数中,我们首先定义一个字符数组str
,用于存储输入的字符串。
然后,我们使用scanf
函数读取字符串。
接下来,我们调用isValidIdentifier
函数判断字符串是否是合法的C语言标识符。
最后,根据isValidIdentifier
的返回值,我们使用printf
函数输出"yes"或"no",表示给定字符串是否是合法的C语言标识符。
编译并运行上述代码,根据给定的输入示例,将会输出"no",表示给定字符串不是合法的C语言标识符。
第5题:与指定数字相同的数的个数
输出一个整数序列中与指定数字相同的数的个数。
时间限制:1000
内存限制:65536
输入
输入包含三行: 第一行为N,表示整数序列的长度(N <= 100); 第二行为N个整数,整数之间以一个空格分开; 第三行包含一个整数,为指定的整数m。
输出
输出为N个数中与m相同的数的个数。
样例输入
3
2 3 2
2
样例输出
2
以下是使用C语言编写的解决方案,用于计算整数序列中与指定数字相同的数的个数:
#include <stdio.h>
int main() {
int N;
scanf("%d", &N);
int sequence[N];
for (int i = 0; i < N; i++) {
scanf("%d", &sequence[i]);
}
int m;
scanf("%d", &m);
int count = 0;
for (int i = 0; i < N; i++) {
if (sequence[i] == m) {
count++;
}
}
printf("%d\n", count);
return 0;
}
在此解决方案中,我们首先定义一个变量N
,用于存储整数序列的长度。
然后,我们使用scanf
函数读取N
的值。
接下来,我们定义一个整数数组sequence
,大小为N
,用于存储整数序列。
使用循环结构,我们遍历整数序列,并使用scanf
函数将每个整数读取到sequence
数组中。
然后,我们定义一个变量m
,用于存储指定的整数。
再次使用scanf
函数,我们读取m
的值。
接下来,我们定义一个变量count
,用于计算与m
相同的数的个数。初始值为0。
使用循环结构,我们遍历整数序列,检查每个数是否与m
相同。如果相同,我们将count
加1。
最后,我们使用printf
函数输出count
的值,表示与m
相同的数的个数。
编译并运行上述代码,根据给定的输入示例,将会输出"2",表示整数序列中与指定数字相同的数的个数为2。