题目:
描述
牛牛刚学会数组不久,他拿到两个数组 a 和 b,询问 b 的哪一段连续子数组之和与数组 a 之和最接近。
如果有多个子数组之和同样接近,输出起始点最靠左的数组。
输入描述:
第一行输入两个正整数 n 和 m ,表示数组 a 和 b 的长度。
第二第三行输入 n 个和 m 个正整数,表示数组中 a 和 b 的值。
输出描述:
输出子数组之和最接近 a 的子数组
示例1
输入:
2 6 30 39 15 29 42 1 44 1
输出:
29 42
示例2
输入:
6 1 50 47 24 19 46 47 2
输出:
2
思路讲解:
这段代码的功能是从两个数组中选择一段连续的子数组,使得两个子数组的和之差最小,并输出该子数组。
首先,在主函数中,使用 scanf
函数分别读入变量 n
和 m
,分别表示数组 a
和 b
的长度。然后定义了两个数组 a
和 b
,并使用循环分别读入数组元素。
接下来,代码使用循环计算数组 a
的元素之和,并将其保存在变量 sum1
中。然后初始化变量 min
为 sum1
,表示初始的两个子数组的和之差。
接下来进入嵌套的循环,外层循环控制数组 b
的起始位置,内层循环控制数组 b
的结束位置。在内层循环中,计算当前子数组的和 sum2
,并使用函数 num
计算 sum1
和 sum2
的差的绝对值。如果得到的差值小于当前最小值 min
,则更新 min
和相应的起始位置 k
和结束位置 l
。
最后,通过循环遍历输出数组 b
中起始位置 k
到结束位置 l
的元素。
请注意,代码中使用了函数 num
来计算两个数字的差的绝对值。函数 num
的实现非常简单,它接受两个参数 a
和 b
,并返回它们之间的差的绝对值。
答案:
#include <stdio.h>// 计算两个数的绝对值差
int num(int a, int b) {if (a >= b)return a - b;elsereturn b - a;
}int main() {int n, m;scanf("%d %d", &n, &m);int a[100] = {0};int b[100] = {0};int sum1 = 0, sum2 = 0, min, k, l;// 读取数组 a 的元素for (int i = 0; i < n; i++) {scanf("%d", &a[i]);}// 读取数组 b 的元素for (int i = 0; i < m; i++) {scanf("%d", &b[i]);}// 计算数组 a 的元素之和for (int i = 0; i < n; i++) {sum1 += a[i];}min = sum1;// 寻找两个子数组的和之差的绝对值最小值for (int i = 0; i < m; i++) {sum2 = b[i];for (int j = i + 1; j <= m; j++) {if (num(sum1, sum2) < min) {min = num(sum1, sum2);k = i;l = j;}sum2 += b[j];}}// 输出和之差最小的子数组for (int i = k; i < l; i++) {printf("%d ", b[i]);}return 0;
}