一、题目及要求:
题目:返回一个整数数组中最大子数组的和
要求(新加):①如果数组A[0]...A[j-1]首尾相邻,允许A[i-1]...A[n-1],A[0]...A[j-1]之和最大;②同时返回最大子数组的位置。
结对人员:胡亚宝 焦燕
二、设计思路:
我们要解决两个问题:求出环数组中最大的子数组;并且定位出该子数组的位置,把它们的名称输出来。要解决这两个问题,我们从以下两个方面入手:
①求出最大子数组:将数组数值按顺序排好称为“一趟”,每求出一趟的最大子数组后,将第一个数值放到最后一个,排成新的一趟,以此类推,直到遍历完成,求出最大环子数组。
②定位子数组:判断出当前求的和值为负数时,将之舍去,并将该数的下一个数的位置存起来作为最大子数组的头。当求出最大值后,该数的位置存起来作为子数组的尾。最后输出将子数组的名称。
三、源代码:
1 //结对开发——胡亚宝 焦燕 2 3 #include "stdafx.h" 4 5 6 int _tmain(int argc, _TCHAR* argv[]) 7 { 8 int i,j,k,m,n,o,a[5]; 9 int Sum,Max,flag,flag1=0,flag2,flag4; 10 11 printf("请输入5个整数: "); 12 for(k=0;k<5;k++) 13 { 14 scanf("%d",&a[k]); 15 } 16 Max = a[0]; 17 for (m=0;m<5;m++) 18 { 19 for(i=0;i<5;i++) 20 { 21 Sum = 0; 22 for(j=i;j<5;j++) 23 { 24 Sum =Sum+ a[j]; 25 if(Sum<=0) 26 { 27 Sum=0; 28 flag1=(j+1+m)%5; 29 } 30 if(Sum > Max) 31 { 32 Max =Sum; 33 flag2=j+m; 34 } 35 } 36 } 37 flag=a[0]; 38 for(n=0;n<5;n++) 39 { 40 a[n]=a[n+1]; 41 } 42 a[4]=flag; 43 } 44 if(Sum==0) 45 { 46 47 Max=a[0]; 48 for(int e=0;e<5;e++) 49 { 50 if(a[e]>=Max) 51 { 52 Max=a[e]; 53 flag4=e; 54 } 55 } 56 57 } 58 printf("最大连续环子数组的和为:%d ",Max); 59 printf("该最大连续环子数组为:"); 60 61 if(Sum==0) 62 { 63 printf("a[%d]",flag4); 64 } 65 else 66 { 67 int flag3=flag2-flag1; 68 for(o=0;o<=flag3;o++) 69 { 70 printf("a[%d] ",flag1); 71 flag1++; 72 if(flag1>4) 73 flag1=0; 74 } 75 } 76 printf(" "); 77 return 0; 78 }
四、测试及运行结果:
测试数据:
3 6 -9 0 7(有正数、负数、零)
7 9 3 2 8 (只有正数)
-3 -6 -9 -2 -5(只有负数)
运行结果:
五、心得体会:
这次实验我们听了老师的要求后,两个人都各自想实现的方法,然后各自说出自己的方法给对方听,结果两人说着说着就知道自己的算法错误在哪,缺点在哪。最后我们决定采用张世通同学的方法。
利用原来的代码使每求出一趟的最大子数组后,利用for循环将第一个数值放到最后一个,排成新的一趟,以此类推,直到遍历完成,求出最大环子数组;但是在定位时,我们遇到了困难,胡亚宝和我在周六试了一下午才实现。当时特别有成就感,虽然方法是胡亚宝想出来的,但当时特别有成就感。
工作照: