返回一个整数数组中最大子数组的和。
设计思想:
1.随机生成数组(含有正数与负数)。
2.求所有子数组:按数组长度进行数组的划分(因为要求数组是连续的)。
3.计算:从第一个数开始做加法,若和大于第二个数,则继续加下一个数(若加上第三个数的和大于第三个数,则重复进行此操作;小于第三个数,则舍掉前面所有数,并继续就重复进行此操作);若小于第二个数,则舍掉第一个数。
源代码:
#include <iostream>
#include<time.h>
using namespace std;
int maxSum(int* a, int n)
{
int sum=0;
//其实要处理全是负数的情况,很简单,如稍后下面第3点所见,直接把这句改成:"int sum=a[0]"即可
//也可以不改,当全是负数的情况,直接返回0,也不见得不行。
int b=0;
for(int i=0; i<n; i++)
{
if(b<0)
b=a[i];
else
b+=a[i];
if(sum<b)
sum=b;
}
return sum;
}
int main()
{
int n=1000,k=0;
int *a=new int [n];
for( int i = 0 ; i < n ; i++)
{
a[i] = rand()%20 - 10 ;
}
for( int i = 0 ; i < n ; i++)
{
cout<<a[i]<<" ";
}
for( int i = 0 ; i < n ; i++)//产生的数组都为负数时的情况
{
if(a[i]<0)
{
k++;
}
}
if(n==k)
{
for( int i = 1 ; i < n ; i++)
{
k=a[0];
if(a[i]>k)
{
k=a[i];
}
}
cout<<"最大和为:"<<k<<endl;
}
else
{
cout<<"最大和为:"<<maxSum(a,n)<<endl;
}
cout<<"请输入数组长度:"<<endl;
cin>>n;
cout<<"请输入数组元素:"<<endl;
for( int i = 0 ; i < n ; i++)
{
cin>>a[i] ;
}
cout<<endl;
for( int i = 0 ; i < n ; i++)//产生的数组都为负数时的情况
{
if(a[i]<0)
{
k++;
}
}
if(n==k)
{
for( int i = 1 ; i < n ; i++)
{
k=a[0];
if(a[i]>k)
{
k=a[i];
}
}
cout<<"最大和为:"<<k<<end
}
else
{
cout<<"最大和为:"<<maxSum(a,n)<<endl;
}
return 0;
}
l;
工作照:
总结: