📅  最后修改于: 2023-12-03 14:58:21.708000             🧑  作者: Mango
该问题是2021年门计算机科学工程学科的设置1中的第13题。该题要求编写一个函数,以递归方式计算一个数字数组的最大值和次大值。
给定一个数字数组,编写一个函数 find_largest_and_second_largest()
,该函数以递归方式计算最大值和次大值,并将它们存储在结果数组中。结果数组的第一个元素应该是最大值,第二个元素应该是次大值。
函数原型:
void find_largest_and_second_largest(int arr[], int size, int results[]);
输入:
arr
:整数数组,表示要计算的数字size
:数组的大小results
:整数数组,大小为2。结果数组中的第一个元素应该是最大值,第二个元素应该是次大值。输出:
results
:数组中的第一个元素是最大值,第二个元素是次大值输入包含多个测试用例。每个测试用例的第一行包含一个整数 n
,表示数字数组的大小。接下来的 n
行包含数字数组的元素。
输入以一个整数 0
结束。
对于每个测试用例,输出占一行,包含两个整数,用空格隔开。第一个整数是结果数组中的最大值,第二个整数是结果数组中的次大值。
输入:
3
1
2
3
4
0
输出:
3 2
本题可以使用递归方法求解。对于一个数字数组,我们可以将其分成两个部分,每个部分再递归调用 find_largest_and_second_largest()
函数,最后比较两个部分的结果,得出最大值和次大值。
在递归函数中,如果数组大小为1,则返回输入数组的第一个元素作为最大值和次大值;如果数组大小为2,则比较两个数字的大小,返回结果数组;否则,将数组分成两部分递归调用本函数,最后比较两个部分的结果,得出最大值和次大值。
void find_largest_and_second_largest(int arr[], int size, int results[]) {
if (size == 1) {
results[0] = arr[0];
results[1] = arr[0];
} else if (size == 2) {
if (arr[0] > arr[1]) {
results[0] = arr[0];
results[1] = arr[1];
} else {
results[0] = arr[1];
results[1] = arr[0];
}
} else {
int m = size / 2;
int left[2], right[2];
find_largest_and_second_largest(arr, m, left);
find_largest_and_second_largest(arr + m, size - m, right);
if (left[0] > right[0]) {
results[0] = left[0];
if (left[1] > right[0]) {
results[1] = left[1];
} else {
results[1] = right[0];
}
} else {
results[0] = right[0];
if (right[1] > left[0]) {
results[1] = right[1];
} else {
results[1] = left[0];
}
}
}
}
在主函数中,可以按以下方式调用上述函数:
int main() {
int arr[100], n, results[2];
while (1) {
scanf("%d", &n);
if (n == 0) {
break;
}
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
find_largest_and_second_largest(arr, n, results);
printf("%d %d\n", results[0], results[1]);
}
return 0;
}
本题解完整代码可以参考 GitHub。