小组成员:马翔 & 胡佳奇

      求出一个连续数组中子数组的最大和。我们的考虑是在一个连续的数组如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;
}