一.题目要求
返回一个整数数组中最大子数组的和。
要求程序必须能处理1000 个元素;
每个元素是int32 类型的;
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。
二.代码
#include<iostream>
#include<ctime>
#include<stdlib.h>
#define N 100000
using namespace std;
void main()
{
long long begin;//子序列的开头
long long end;//子序列的结尾
long long newsum;//当前子序列最大值
long long maxsum;//子序列最大值
srand((unsigned)time(NULL));//生成随机数
long long a[N], i, n;
/*begin = 0;
end = 0;*/
newsum = 0;//初始化
maxsum = a[0];//初始化
cout << "请输入数组里面包含数的个数:" << endl;
cin >> n;
for (i = 0; i < n; i++)
{
a[i] = rand() % 21 - 10;
}
cout << "数组a[" << n << "]为:";
for (i = 0; i < n; i++)
{
cout << a[i] << " ";
}
cout << endl;
for (i = 0; i<n; i++)//开始循环求子序列和
{
newsum = newsum + a[i];
if (newsum > maxsum)//更新当前子序列的和
{
maxsum = newsum;
end = i;
}
if (newsum < 0)//假若当前子序列和为负,则舍弃
{
begin = i + 1;
newsum = 0;
}
}
cout << "最大的子序列和为:" << maxsum << endl;
cout << "最大的序列为:";
for (long long k = begin; k <= end; k++)
{
cout << a[k] << " ";
}
cout << endl;
}
如果当前序列加到小于零了则直接舍去前面的,其中要知道只要前几位是负数,则一定不是最大子序列,
控制台窗口一次输出的最大行数是 299行.超过这个数目的话前面超出的会被忽视.
这是因为缓存不够,
开始-- 运行---输入cmd回车===>在出来的cmd窗口左上角图标上点左键出来菜单--选属性--选布局页面--把屏幕缓冲区大小的高度改大就行了
![](https://i-blog.csdnimg.cn/blog_migrate/7dbb70ddb8c6fbf217deec9606890a95.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/4c6dc474d6c7cabb6e0f88ab00af0a16.png)
![](https://i-blog.csdnimg.cn/blog_migrate/fd9f174c23c5a69860b91772727ea933.png)