牛牛刚学会数组不久,他拿到两个数组 a 和 b,询问 b 的哪一段连续子数组之和与数组 a 之和最接近。
如果有多个子数组之和同样接近,输出起始点最靠左的数组。
第一行输入两个正整数 n 和 m ,表示数组 a 和 b 的长度。
第二第三行输入 n 个和 m 个正整数,表示数组中 a 和 b 的值。
输出子数组之和最接近 a 的子数组
输入:
2 6 30 39 15 29 42 1 44 1
输出:
29 42
输入:
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;
else
return 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;
}