小组成员:安娜 王鑫楠
题目二:求整数数组中连续子数组和的最大值。
1、分析过程:
题目收到后,前五分钟设计算法,首先也想到是不是一次遍历可以解决,考虑了一下觉得难度有点大最后还是果断放弃。我刚开始的以思路是以子数组的长度作为第一层循环条件,即以2长度为例:比较a[0]+a[1],a[1]+a[2],......a[N-2]+a[N-1]的大小。安娜的思路是以数组的顺序为第一层循环条件,即以a[0]为例:分别比较a[0],a[0]+a[1],a[0]+a[1]+a[2],.....a[0]+...a[N-1]大小。最后我们选择了安娜的想法。
2、代码编写过程
前20分钟安娜“驾驶”,我来“导航”,然后交换角色。
代码如下:
1 #include<stdio.h> 2 #define N 5 3 4 void sumarray(int a[]) 5 { 6 int i,j; 7 int locl=0,loch=0; 8 int maxsum=a[0]; 9 int sum; 10 for(i=0;i<N;i++) 11 { 12 // sum=a[i]; 13 for(j=i;j<N;j++) 14 { 15 if(i==j) 16 { 17 sum=a[i]; 18 } 19 else 20 { 21 sum=sum+a[j]; 22 } 23 if(maxsum<sum) 24 { 25 maxsum=sum; 26 locl=i; 27 loch=j; 28 } 29 //sum=sum+a[j+1]; 30 } 31 } 32 printf("最大值:%d\n",maxsum); 33 34 printf("子数组下标:%d %d\n",locl,loch); 35 } 36 void main() 37 { 38 int a[N]={1,2,3,4,5}; 39 sumarray(a); 40 }
运行结果:
3、测试过程:
(1)第一次运行发现和过于大,发现是大意的错误,将sum=sum+a[i]写成sum+=sum+a[i]。
(2)用int a[N]={-2,-3,-4,-5,-2};测试,结果为:
发现是 locl,loch未赋初值。修改为int locl=0,loch=0。
(3)a[j+1处会数组溢出,虽然不影响测验结果的正确性(vc++6.0的环境下对溢出的数组成员有赋初值),但是换个运行环境可能就会出错,最后加了个if else语句将a[j+1]用
a[j]代替。
for(i=0;i<N;i++) { sum=a[i]; for(j=i;j<N;j++) { if(maxsum<sum) { maxsum=sum; locl=i; loch=j; } sum=sum+a[j+1]; } }