小组成员:马翔 & 胡佳奇
求出一个连续数组中子数组的最大和。我们的考虑是在一个连续的数组如int[10]中求出其中最大的子数组之和然后将值返回给主函数输出。
刚开始的思路是从第一个数开始,先算子数组长度为1时的子数组和,再算子数组长度为2时的子数组和,然后以此类推直到算子数组长度为10的子数组和。经过代码实践,发现这个思路至少要用到三层嵌套才能实现,而且内层循环的循环边界复杂,要设置的变量多。
后来经过讨论和思考,想到一个比较好的办法,即定义两个循环初始量 i,j。 i用来指向数组的第一个数,然后用sum记录j从i的位置开始相加的和,每得到一个和就跟max进行比较,如果sum大于max,则将sum赋给max。然后 i指向第二个数,j在进行上述过程。用这个双层循环就能把所有符合条件的子数组都检查一遍,从而找到和最大的子数组。我们的程序的时间复杂度为O(n2),还没有达到要求中的O(n),还要在以后的过程中再行思考。
讨论图纸:
运行结果:
程序代码:
#include "stdafx.h" #include<stdio.h> int Max(int B[],int length) //求最大和函数 { int i,j; int max=B[0]; int sum=0; for(i=0;i<length;i++) { sum=0; for(j=i;j<length;j++) { sum=sum+B[j]; if(max<sum) { max=sum; } } } return max; } int main(int argc, char* argv[]) { int A[10]={-1,1,-2,2,-3,3,-4,4,-5,5}; //测试用例 int B[6]={0,0,0,0,0,0}; int C[1]={9}; int i; printf("测试用例:\n"); //第一组测试 for(i=0;i<sizeof(A)/sizeof(int);i++) printf("%d,",A[i]); printf("\n子数组最大和为:%d\n\n",Max(A,10)); for(i=0;i<sizeof(B)/sizeof(int);i++) //第二组测试 printf("%d,",B[i]); printf("\n子数组最大和为:%d\n\n",Max(B,6)); for(i=0;i<sizeof(C)/sizeof(int);i++) //第三组测试 printf("%d,",C[i]); printf("\n子数组最大和为:%d\n\n",Max(C,1)); return 0; }