结对开发—求环数组的最大子数组的和,并返回其最大子数组3

结对成员:信1201-1班    黄亚萍

              信1201-1班    袁亚姣

一、题目要求

  题目:返回一个整数数组中最大子数组的和。
  要求:
      输入一个整形数组,数组里有正数也有负数。
      数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
      如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。
      同时返回最大子数组的位置。
      求所有子数组的和的最大值。要求时间复杂度为O(n)。

二、设计思路

      这次的主要问题在于这次的一位数组要首尾相连,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大,所以我们采用以下方法寻找最大值,如输入 a1 a2 a3 a4这4位数,我们将其扩展为

            a1 a2 a3 a4 a1 a2 a3

在第一个的基础上进行扩展,很容易得到结果,并返回最大数组

三、源代码 

 1 #include "stdio.h"
 2 #include"stdlib.h"
 3 #include"time.h"
 4 #define N 1000 
 5 int a=0,b=0;
 6 int q=0;
 7 int compare( int arry1[],int length)
 8 {
 9     int max[N],max1,i,j,q;
10     int fmax=max[0];
11     int arr[N];    
12     
13     for(j=0;j<length;j++)
14     {
15         int sum=0;
16     
17         max1=-9876;
18         for(i=j;i<j+length;i++)
19         {
20             sum=sum+arry1[i];
21             if(sum>=max1)
22             {
23                 max1=sum;
24                 q=i;
25             }
26         }
27         max[j]=max1;
28         arr[j]=q;
29         printf("包含数组中第%d个数的所有子数组中和最大的值为:%d\n",j+1,max[j]);
30         if(max[j]>fmax)
31         {
32             fmax=max[j];
33             a=j;
34             b=arr[j];
35         }
36     }
37     printf("所有子数组的和的最大值为:%d\n",fmax);
38     for(i=a;i<b+1;i++)
39     {
40         printf("%d ",arry1[i]);
41     }
42     printf("\n");
43     return 0;
44 }
45 int main(int argc, char* argv[])
46 {
47     int arry[N],arry1[N];
48     int length;
49     srand(time(NULL));
50     printf("请输入要比较整数的个数:");
51     scanf("%d",&length);
52     printf("请输入整数:");
53     for(int i=0;i<length;i++)
54     {
55         scanf("%d",&arry[i]);
56     
57     }
58     for( i=0;i<2*length-1;i++)
59     {
60         if(i<length)
61         {
62             arry1[i]=arry[i];
63         }
64         else
65         {
66             arry1[i]=arry[i-length];
67         }
68         printf("%d ",arry1[i]);
69     }
70     printf("\n");
71     compare(arry1,length);
72     return 0;
73 }

四、运行结果截图
     

五、总结与心得

      通过这几次团队合作的实验中,我真正的认识到团队合作的重要性,它能够帮助我们认识到自己思维的不足与片面性,比如说,在本次实验中,求环形数组的最大子数组的和,我们通过转化,把它等价于一个展开的一维数字来进行运算,这是我们一起商讨的结果,但是同时,也有我们忽略的,也是我们的不足之处,当环形数组的元素个数的和大于0,那么环形数组的子数组是n次循环的结果的话,那最后的子数组的和的最大值对应的子数组的元素个数是无穷个。

    

posted @ 2015-03-30 13:07  快乐宝贝hyp  阅读(153)  评论(2编辑  收藏  举报