第1题:数组逆序重放
将一个数组中的值按逆序重新存放。例如,原来的顺序为8,6,5,4,1。要求改为1,4,5,6,8。
输入
输入为两行:第一行数组中元素的个数n(1
输出
输出为一行:输出逆序后数组的整数,每两个整数之间用空格分隔。
样例输入
5
8 6 5 4 1
样例输出
1 4 5 6 8
以下是解决该问题的C语言代码:
#include <stdio.h>
void reverseArray(int arr[], int n) {
int start = 0;
int end = n - 1;
while (start < end) {
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
start++;
end--;
}
}
int main() {
int n;
scanf("%d", &n);
int arr[n];
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
reverseArray(arr, n);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
你可以将上述代码保存为一个名为 “reverse_array.c” 的文件,并使用C编译器进行编译和运行。在输入数组元素的个数n以及数组元素后,程序将对数组进行逆序重放,并输出结果。
在主函数中,我们首先读取数组元素的个数n,并定义一个整数数组 arr
来存储数组元素。
接下来,我们使用一个循环来读取数组的元素,并将它们存储在数组 arr
中。
然后,我们调用 reverseArray
函数来逆序重放数组。该函数使用两个指针 start
和 end
来追踪数组的起始和结束位置。我们使用一个循环来交换 start
和 end
指针所指向的元素,并将它们向中间移动,直到 start
不再小于 end
。
最后,我们使用一个循环来输出逆序后的数组元素,并在相邻元素之间添加空格。
请注意,这个解决方案假设输入是有效的,并且满足题目要求。如果输入超出限制范围,可能会导致输出错误。
第2题:最长最短单词
输入1行句子(不多于200个单词,每个单词长度不超过100),只包含字母、空格和逗号。单词由至少一个连续的字母构成,空格和逗号都是单词间的间隔。
试输出第1个最长的单词和第1个最短单词。
输入
一行句子。
输出
两行输出: 第1行,第一个最长的单词。 第2行,第一个最短的单词。
样例输入
I am studying Programming language C in Peking University
样例输出
Programming
I
以下是解决该问题的C语言代码:
#include <stdio.h>
#include <string.h>
void findLongestShortestWords(char sentence[]) {
char longestWord[101];
char shortestWord[101];
char word[101];
int wordLength = 0;
int i = 0;
while (sentence[i] != '\0') {
if (sentence[i] != ' ' && sentence[i] != ',') {
word[wordLength] = sentence[i];
wordLength++;
} else {
word[wordLength] = '\0';
if (strlen(longestWord) == 0) {
strcpy(longestWord, word);
}
if (strlen(shortestWord) == 0 || strlen(word) < strlen(shortestWord)) {
strcpy(shortestWord, word);
}
wordLength = 0;
}
i++;
}
word[wordLength] = '\0';
if (strlen(longestWord) == 0) {
strcpy(longestWord, word);
}
if (strlen(shortestWord) == 0 || strlen(word) < strlen(shortestWord)) {
strcpy(shortestWord, word);
}
printf("%s\n", longestWord);
printf("%s\n", shortestWord);
}
int main() {
char sentence[201];
fgets(sentence, sizeof(sentence), stdin);
// 去除末尾的换行符
if (sentence[strlen(sentence) - 1] == '\n') {
sentence[strlen(sentence) - 1] = '\0';
}
findLongestShortestWords(sentence);
return 0;
}
你可以将上述代码保存为一个名为 “longest_shortest_words.c” 的文件,并使用C编译器进行编译和运行。在输入句子后,程序将找到第一个最长的单词和第一个最短的单词,并进行输出。
在主函数中,我们首先读取句子,并使用 fgets
函数来获取完整的输入行,包括空格和逗号。
接下来,我们定义两个字符数组 longestWord
和 shortestWord
来存储最长和最短的单词。
然后,我们使用一个循环来遍历句子中的每个字符。如果字符不是空格或逗号,我们将其添加到 word
数组中,并增加 wordLength
的值。当遇到空格或逗号时,我们将 word
数组末尾添加一个空字符 ‘\0’,表示单词的结束。
然后,我们检查当前单词是否是最长的单词。如果 longestWord
数组为空,我们将当前单词复制到 longestWord
数组中。然后,我们检查当前单词是否比 shortestWord
更短。如果 shortestWord
数组为空,或者当前单词长度小于 shortestWord
的长度,我们将当前单词复制到 shortestWord
数组中。
最后,我们再次检查最后一个单词,并输出最长和最短的单词。
请注意,这个解决方案假设输入是有效的,并且满足题目要求。如果输入超出限制范围,可能会导致输出错误。
第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
输入
输入包含一个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>
#define ROWS 5
#define COLS 5
void findSaddlePoint(int matrix[ROWS][COLS]) {
for (int i = 0; i < ROWS; i++) {
int maxVal = matrix[i][0];
int maxCol = 0;
for (int j = 1; j < COLS; j++) {
if (matrix[i][j] > maxVal) {
maxVal = matrix[i][j];
maxCol = j;
}
}
int minVal = matrix[0][maxCol];
int minRow = 0;
for (int k = 1; k < ROWS; k++) {
if (matrix[k][maxCol] < minVal) {
minVal = matrix[k][maxCol];
minRow = k;
}
}
if (minRow == i) {
printf("%d %d %d\n", i + 1, maxCol + 1, maxVal);
return;
}
}
printf("not found\n");
}
int main() {
int matrix[ROWS][COLS];
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
scanf("%d", &matrix[i][j]);
}
}
findSaddlePoint(matrix);
return 0;
}
你可以将上述代码保存为一个名为 “saddle_point.c” 的文件,并使用C编译器进行编译和运行。在输入矩阵后,程序将查找矩阵中的鞍点,并进行输出。
在主函数中,我们首先定义一个5x5的整数矩阵 matrix
来存储输入数据。
然后,我们使用两个嵌套的循环来读取矩阵的每个元素,并将其存储在 matrix
中。
接下来,我们调用 findSaddlePoint
函数来查找鞍点。在该函数中,我们使用两个循环来遍历矩阵的每一行。对于每一行,我们找到最大值及其所在列 maxVal
和 maxCol
。
然后,我们在该列上查找最小值及其所在行 minVal
和 minRow
。如果 minRow
等于当前行 i
,则说明找到了鞍点,我们将其行号、列号和值进行输出,并使用 return
终止函数。
如果没有找到鞍点,则在循环结束后输出 “not found”。
请注意,这个解决方案假设输入是有效的,并且满足题目要求。如果输入不符合要求,可能会导致输出错误。
第4题:病人排队
病人登记看病,编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:
1.老年人(年龄 >= 60岁)比非老年人优先看病。
2.老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。
3.非老年人按登记的先后顺序看病。
输入
第1行,输入一个小于100的正整数,表示病人的个数; 后面按照病人登记的先后顺序,每行输入一个病人的信息,包括:一个长度小于10的字符串表示病人的ID(每个病人的ID各不相同且只含数字和字母),一个整数表示病人的年龄,中间用单个空格隔开。
输出
按排好的看病顺序输出病人的ID,每行一个。
样例输入
5
021075 40
004003 15
010158 67
021033 75
102012 30
样例输出
021033
010158
021075
004003
102012
以下是解决该问题的C语言代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char id[11];
int age;
} Patient;
int comparePatient(const void* a, const void* b) {
const Patient* patientA = (const Patient*)a;
const Patient* patientB = (const Patient*)b;
// 老年人优先
if (patientA->age >= 60 && patientB->age < 60) {
return -1;
} else if (patientA->age < 60 && patientB->age >= 60) {
return 1;
}
// 年龄相同,按照登记的先后顺序排序
if (patientA->age == patientB->age) {
return strcmp(patientA->id, patientB->id);
}
// 老年人按年龄从大到小排序
return patientB->age - patientA->age;
}
int main() {
int numPatients;
scanf("%d", &numPatients);
getchar(); // 读取换行符
Patient* patients = (Patient*)malloc(numPatients * sizeof(Patient));
for (int i = 0; i < numPatients; i++) {
scanf("%s %d", patients[i].id, &patients[i].age);
getchar(); // 读取换行符
}
// 使用标准库函数qsort进行排序
qsort(patients, numPatients, sizeof(Patient), comparePatient);
for (int i = 0; i < numPatients; i++) {
printf("%s\n", patients[i].id);
}
free(patients);
return 0;
}
你可以将上述代码保存为一个名为 “patient_queue.c” 的文件,并使用C编译器进行编译和运行。在输入病人信息后,程序将按照题目要求对病人进行排序,并按顺序输出病人的ID。
在主函数中,我们首先读取病人的个数,并根据个数动态分配内存来存储病人信息。
然后,使用一个循环读取每个病人的ID和年龄,并存储在 patients
数组中。
接下来,我们使用标准库函数 qsort
对 patients
数组进行排序。排序时,我们使用自定义的比较函数 comparePatient
进行比较。
在 comparePatient
函数中,我们首先根据老年人和非老年人的优先级进行比较。如果一个病人是老年人而另一个不是,我们将老年人排在前面。
对于年龄相同的病人,我们按照他们的ID进行字典序比较,并返回比较结果。
对于老年人,我们按照年龄从大到小排序。对于非老年人,我们保留它们的原始顺序。
最后,我们按顺序输出排序后的病人ID。
请注意,这个解决方案假设输入是有效的,并且满足题目要求。如果输入不符合要求,可能会导致输出错误。
第5题:循环数
若一个n位的数字串满足下述条件,则称其是循环数(cyclic):将这个数字串视为整数(可能带有前导0),并用任意一个 1 到 n 之间(包含1和n)的整数去乘它时, 会得到一个将原数字串首尾相接后,再在某处断开而得到的新数字串所对应的整数。例如,数字 142857 是循环数,因为:
142857 *1 = 142857
142857 *2 = 285714
142857 *3 = 428571
142857 *4 = 571428
142857 *5 = 714285
142857 *6 = 857142。
请写一个程序判断给定的数是否是循环数。
注意:在此题中,输入数字串允许带前导0,且前导0不能被忽略,例如“01”是两位数字串,而“1”是一位数字串。但将数字串转化为整数做乘法运算或比较运算时,可以忽略前导0。
时间限制:10000
内存限制:65536
输入
一行,一个长度在 2 到 60 位之间的数字串。
输出
一个整数,若输入的数字串是循环数,输出1,否则输出0。
样例输入
142857
样例输出
1
以下是解决该问题的C语言代码:
#include <stdio.h>
#include <string.h>
int isCyclicNumber(const char* number) {
int len = strlen(number);
for (int i = 1; i <= len; i++) {
int multiplier = 1;
int position = 0;
int isCyclic = 1;
while (position < len) {
int digit = number[position] - '0';
int product = digit * multiplier;
char productStr[61];
sprintf(productStr, "%d", product);
int productLen = strlen(productStr);
if (position + productLen > len) {
isCyclic = 0;
break;
}
if (strncmp(number + position, productStr, productLen) != 0) {
isCyclic = 0;
break;
}
position += productLen;
multiplier++;
}
if (isCyclic) {
return 1;
}
}
return 0;
}
int main() {
char number[61];
scanf("%s", number);
int result = isCyclicNumber(number);
printf("%d\n", result);
return 0;
}
你可以将上述代码保存为一个名为 “cyclic_number.c” 的文件,并使用C编译器进行编译和运行。在输入数字串后,程序将判断该数字串是否是循环数,并输出结果。
在主函数中,我们首先读取输入的数字串,并将其存储在 number
字符数组中。
然后,我们调用 isCyclicNumber
函数来判断该数字串是否是循环数。在该函数中,我们使用一个循环来遍历可能的乘数。对于每个乘数,我们从数字串的第一个位置开始,依次计算乘积并与原数字串进行比较。
首先,我们将当前位置的字符转换为数字,并将其乘以当前乘数。然后,我们将乘积转换为字符串 productStr
。
如果当前位置加上乘积的长度超过了数字串的总长度,或者当前位置开始的子串与乘积不匹配,那么该数字串不是循环数,我们将 isCyclic
设置为0并跳出循环。
如果所有乘数都能使原数字串首尾相接地生成循环数,那么该数字串是循环数,我们返回1。
最后,我们在主函数中根据返回的结果输出1或0,表示输入数字串是否是循环数。
请注意,这个解决方案假设输入是有效的,并且满足题目要求。如果输入不符合要求,可能会导致输出错误。