求数组子数组之和最大值问题-犯了一个很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编辑  收藏  举报

导航