结队成员:范德一,赵永恒
一.题目
返回一个整数数组中最大子数组的和。
要求:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。
同时返回最大子数组的位置。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
二.设计思路
我们在上次实验的基础上,通过在原有的循环体的最外边再添加了一个循环条件,这个循环条件是在第一次循环之后,将数组中每个数的值赋给它前面一个数,这样在最后一次循环的时候就实现了首尾相连。
三.实验代码
1 #include<iostream.h> 2 3 #include<time.h> 4 5 #include<stdlib.h> 6 7 8 9 int main() 10 11 { 12 13 int a[10]; 14 15 int m; //m是每组个数 16 17 int *sum=new int[10]; 18 19 srand((unsigned)time(NULL)); 20 21 cout<<"*********************************"<<endl; 22 23 for(int i=0;i<10;i++) 24 25 { 26 27 int b; 28 29 b=rand()%2; 30 31 switch (b) 32 33 { 34 35 case 0: 36 37 a[i]=rand()%100; 38 39 break; 40 41 case 1: 42 43 a[i]=-rand()%100; 44 45 break; 46 47 } 48 49 cout<<a[i]<<" "; 50 51 /* if((i%10)==4) 52 53 cout<<endl; */ //每行10个输出,换行 54 55 56 57 } 58 59 60 61 cout<<"*********************************"<<endl; 62 63 int he=0; 64 65 for(int t=1;t<11;t++) 66 67 { 68 69 for(m=1;m<11;m++) 70 71 { 72 73 int temp=0; 74 75 for(int n=0;n<m;n++) 76 77 { 78 79 temp=temp+a[n]; 80 81 } 82 83 for(int k=0;k<=(10-m);k++) 84 85 { 86 87 sum[k]=0; 88 89 for(int j=k;j<(k+m);j++) //a[k]是每组第一个数 90 91 { 92 93 sum[k]=sum[k]+a[j]; 94 95 } 96 97 if(sum[k]>temp) 98 99 { 100 101 temp=sum[k]; 102 103 } 104 105 } 106 107 if(temp>he) 108 109 { 110 111 he=temp; 112 113 } 114 115 116 117 } 118 119 int temp1=0; 120 121 temp1=a[0]; 122 123 a[0]=a[1]; 124 125 a[1]=a[2]; 126 127 a[2]=a[3]; 128 129 a[3]=a[4]; 130 131 a[4]=a[5]; 132 133 a[5]=a[6]; 134 135 a[6]=a[7]; 136 137 a[7]=a[8]; 138 139 a[8]=a[9]; 140 141 a[9]=temp1; 142 143 } 144 145 cout<<"最大子数组的和为: "<<he<<endl; 146 147 cout<<"*********************************"<<endl; 148 149 return 0; 150 151 }
四.运行截图
五.实验感想
这是我们俩一起改进的第五个程序,结对开发确实觉得自己在两个人的合作中成长了不少,赵永恒对于代码的书写有自己的规范,我觉得能够很好的影响到我,在定义一个变量的时候他能将其意思很明确的表示出来,还有他喜欢用函数的思想来解决问题,在主函数外增加函数实现调用的功能,而我比较喜欢在主函数中直接加入条件控制,我觉得他的思想很值得我去学习,我的套路在一个比较大一点的程序中可能就显得很难实现。
六、合照