所有子数组的最大值

设计思想:

设计思想:输入一个个数为n的数组,①如果第一个数为负数则直接略过,从下一个数开始算,如若开始连续碰到负数则从遇到第一个正整数开始计算,若正数下一个数是正数则直接相加,若是负数则相加后与0比较,如果大于0就继续相加,小于0就重新开始程序。②如果数组里全是负数则取最大数。

问题:

想不出负数正数同时存在的解决方案 需要再遍历一次 无法解决连续两个负数 和全是负数的情况 运行后是0

解决方案:

全是负数找最大的一个负数  如果最大的数是负数  就输出这个数

源代码

#include<iostream>
using namespace std;
int main ()
{
int a[1000],max,max1,count,temp,num; //a[num]输入数组,max暂存最大值,count子数组的和
count=0;
max=0;
temp=0;
cout<<"请输入数组的个数:";
cin>>num;
cout<<"请输入"<<num<<"个整数(可正可负):\n"; //输入数组的值
for (int i=0;i<num;i++)
cin>>a[i];
max1=a[0];
for (int i=0;i<num;i++) //进行一次循环
{
while(a[i]<0&&count==0&&i<num) //如果a[i]<0并且count==0表示最初开始,或者已经存储了一个temp的值,可以跳过所有的负数
{
if(max1<a[i])
max1=a[i];
i++;
}
count+=a[i]; //进行累加
if(count<=(-a[i+1])) //如果累加的和比下一个数的相反数小则可以确定不能再继续累加
{
temp=count; //暂存count
count=0;
}

if(max<=temp&&count!=0) //暂存最大值
{
max=temp;
}
if(count==0||count>max1)
{
max=max1;
}
}
cout <<"子数组的最大和为"<<max<<endl;
system("pause");
return 0;

}

总结 :遇到问题要一步一步解决  ,先想思路再编程  ,选择最简单的方案  ,遇到错误可以通过分段测试来解决查错。

猜你喜欢

转载自www.cnblogs.com/fffxf/p/9786811.html