c语言代码读入一个整型数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值
时间: 2024-03-10 20:48:12 浏览: 223
C语言求连续最大子数组和的方法
5星 · 资源好评率100%
这是一个经典的问题,可以使用动态规划来解决。具体做法如下:
1. 定义一个变量 max_sum,用于记录最大的子数组和,初始值设为数组中的第一个元素。
2. 定义一个变量 cur_sum,用于记录当前子数组的和,初始值也设为数组中的第一个元素。
3. 从数组的第二个元素开始遍历,对于每个元素,进行如下操作:
- 如果 cur_sum 大于 0,将该元素加入当前子数组中,并更新 cur_sum 的值。
- 如果 cur_sum 小于等于 0,表示当前子数组的和已经为负数,无论后面加上什么元素,都不可能使得该子数组的和变得更大,因此应该将当前子数组的和置为该元素的值,并将当前子数组的起始位置置为当前元素的位置。
- 每次更新 cur_sum 的值后,都需要将其与 max_sum 比较,如果 cur_sum 大于 max_sum,则更新 max_sum 的值。
4. 遍历完整个数组后,max_sum 的值即为所有子数组的和的最大值。
以下是具体的 C 代码实现:
```c
#include <stdio.h>
int main() {
int n, max_sum, cur_sum, start, end, i, a[100];
// 读入数组
printf("请输入数组的长度:");
scanf("%d", &n);
printf("请输入数组的元素:");
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
// 初始化
max_sum = cur_sum = a[0];
start = end = 0;
// 遍历数组
for (i = 1; i < n; i++) {
if (cur_sum > 0) {
cur_sum += a[i];
} else {
cur_sum = a[i];
start = i;
}
if (cur_sum > max_sum) {
max_sum = cur_sum;
end = i;
}
}
// 输出结果
printf("最大的子数组和为:%d\n", max_sum);
printf("对应的子数组为:");
for (i = start; i <= end; i++) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
```
阅读全文