只需要输出最大子数组和结果
[08:27:34] gcc sonarrysum.c
[08:27:37] ./a.out
18
[08:27:39] cat sonarrysum.c
#include<stdio.h>
void max(int a[],int len)
{
int i,max=0,count=0;
for(i=0;i<len;i++)//在这里我们先不管数组全部为负数的情况,然后我们会得出只要累加结果小于0了,那就说明这个累加和不是最大的和(因为不全为负数就肯定是有正数了的不是)
{
count+=a[i];
if(count<0)
count=0;
if(count>max)//如果大于之前的最大值就覆盖
max=count;
}
if(max==0)//这里就是考虑全部为负数或者为0的情况
{
max=a[0];//假定第一个数是最大的
for(i=1;i<len;i++)//如果后面的数有大于第一个数的就覆盖最大值
{
if(a[i]>max)
max=a[i];
}
}
printf("%d
",max);
}
int main()
{
int len,a[]={1,-2,3,10,-4,7,2,-5};
len=sizeof(a)/sizeof(a[1]);
max(a,len);
return 0;
}
[08:27:41]
如果我们需要连同输出下标,只需要增加几个语句就可以了
[08:59:56] gcc sonarrysum.c
[08:59:58] ./a.out
max:36 start: 0 end: 2
11 12 13
[08:59:59] cat sonarrysum.c
#include<stdio.h>
void max(int a[],int len)
{
int i,max=0,count=0,start=0,maxstart=0,end=0;
for(i=0;i<len;i++)
{
count+=a[i];
if(count<0)
{
count=0;
start=i+1;//加1是因为a[i]这个数必定为负数,所以需要从下一个开始算
}
if(count>max)//注意这里只有找到了当前最大和时才确定开始和结束下标,maxstart才是最终的开始下标
{
max=count;
end=i;
maxstart=start;
}
}
if(max==0)
{
max=a[0];
maxstart=end=0;
for(i=1;i<len;i++)
{
if(a[i]>max)
{
max=a[i];
maxstart=end=i;
}
}
}
printf("max:%d start: %d end: %d
",max,maxstart,end);
for(i=maxstart;i<=end;i++)
printf("%d ",a[i]);
printf("
");
}
int main()
{
int len,a[]={11,12,13,-44,-1,0,2,3};
len=sizeof(a)/sizeof(a[1]);
max(a,len);
return 0;
}
[09:00:02]