那个我是个新手 今天看了着个帖子 动手试了下 发现是错的 2楼 5楼 9楼的是都出错了主要是在 当 Ni>(Ni+1)+(Ni+2)或>Nj 的时候就回出错 那个9楼就是着现象
下面是小弟弄的 貌似对了 随便看看把 我自己也有点乱
#include <stdio.h>
int maxsubstr(int n, int *a, int *start, int *end)
{
int sum=0, i,b=0,b_negative=1;
*start=0;
for(i=0;i<n;i++)
{
b= b>0? (a[i]+b) : a[i];
if(b>sum)
{
sum=b;
*end=i; /* 记录结束点 */
}
if(b_negative && b>=0)
*start=i; /* 如果b从负数变为正数,则更新子段起始点 */
b_negative=b<0? 1:0; /* 设置b是否为负数的标记 */
}
return sum;
}
void main()
{
int a[]={-2,80,-40,-50,45,20,21,-25,30,2};
int start,end;
int sum=maxsubstr(sizeof a / sizeof a[0],a,&start,&end);
printf("\nsum[%d, %d]=%d\n",start,end,sum);
}
[[it] 本帖最后由 ysjlch 于 2008-3-17 19:47 编辑 [/it]]
下面是小弟弄的 貌似对了 随便看看把 我自己也有点乱
#include <stdio.h>
int maxsubstr(int n, int *a, int *start, int *end)
{
int sum=0, i,b=0,b_negative=1;
*start=0;
for(i=0;i<n;i++)
{
b= b>0? (a[i]+b) : a[i];
if(b>sum)
{
sum=b;
*end=i; /* 记录结束点 */
}
if(b_negative && b>=0)
*start=i; /* 如果b从负数变为正数,则更新子段起始点 */
b_negative=b<0? 1:0; /* 设置b是否为负数的标记 */
}
return sum;
}
void main()
{
int a[]={-2,80,-40,-50,45,20,21,-25,30,2};
int start,end;
int sum=maxsubstr(sizeof a / sizeof a[0],a,&start,&end);
printf("\nsum[%d, %d]=%d\n",start,end,sum);
}
[[it] 本帖最后由 ysjlch 于 2008-3-17 19:47 编辑 [/it]]