求数组子数组之和最大值问题-犯了一个很2B的错误,函数参数啊函数参数
今天写一段代码,错的我没有反抗能力
int main()
{
int test[]={-2, 5, 3, -6, 4, -8, 6};
int startPos=0, endPos=0;
printf("MaxSubArr=%d\nStartPos=%d\nEndPos=%d\n", GetMaxSubArr1(test, LEN(test), &startPos, &endPos), startPos,endPos);
system("pause");
return 0;
}
调试也通了,全正确,咋就不出正确结果呢? startPos=0, endPos=0;一直就没变过,这到底是肿么了。
郁闷的好久, 才发现,原来是参数传递问题, printf函数的参数在传进去时值就确定了 ,startPos=0, endPos= 0 是实参,按值传递的,传过去肯定是0,0
为此,还专门做一实验:
int swap(char* a, char *b )
{
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
return 0;
}
int main()
{
char a = 'a';
char b = 'b';
printf("a=%c,b=%c\n", a, b);
//swap(&a,&b);
printf("return=%d,a=%c,b=%c\n",swap(&a,&b), a, b);
printf("a=%c,b=%c\n", a, b);
system("pause");
}
就是想看下交换的结果,
果不其然啊,罪过啊,罪过啊,这种错误太容易忽视了。
附上求数组子数组之和最大值的代码:
#include "stdio.h"
#include "stdlib.h"
//数组长度宏
#define LEN(arr) sizeof(arr)/sizeof((arr)[0])
//返回最大值
int max(int x, int y)
{
return (x>=y)?x:y;
}
//只求出最大值,不记录最大值数组位置,还额外用了2N的空间,方法比较烂,但好理解。
int GetMaxSubArr(int* arr, int n)
{
int* end = (int*)malloc(sizeof(int)*n);
int* sum = (int*)malloc(sizeof(int)*n);
end[0] = arr[0];
sum[0] = arr[0];
for(int i=1; i<n; i++)
{
int tempPos;
end[i] = max(arr[i], arr[i]+end[i-1]);
sum[i] = max(sum[i+1], max(arr[i], arr[i]+end[i-1]));
}
return sum[n-1];
}
//求出最大值,并且记录最大值数组位置,不用额外空间,方法很妙,学来的,要好好学习
int GetMaxSubArr1(int* arr, int n, int* startPos, int* endPos)
{
int tempPos=0;
int Start=arr[0];
int Sum=arr[0];
for(int i=1; i< n; i++)
{
if(Start<0)
{
Start=0;
*startPos=i;
}
Start+=arr[i];
if(Start>Sum)
{
Sum=Start;
*endPos=i;
tempPos = *startPos;
}
}
*startPos = tempPos;
return Sum;
}
int main1()
{
int test[]={-2, 5, 3, -6, 4, -8, 6};
int startPos=0, endPos=0;
int max = GetMaxSubArr1(test, LEN(test), &startPos, &endPos);
printf("MaxSubArr=%d\nStartPos=%d\nEndPos=%d\n", max, startPos,endPos);
system("pause");
}
要记好犯错误地方,不能在一个地方连着跌倒好多次!
posted on 2011-09-08 20:06 Lovell Liu 阅读(486) 评论(0) 编辑 收藏 举报