数组中子数组之和最大值(首尾相接)
题目:求一维子数组的最大子数组之和(一维数组首尾相接)并写出子数组
人员:
陈晨:程序复查,结果测试。
王颖瑞:编写代码
思路:
1.求最大子数组之和:对于首尾相接的数组来说,如果计算子数组之和,最多把数组循环两遍,所以我们把数组的长度扩大了一倍(如果要算的数组是5位,那么数组就定义为10位,前半部分和后半部分一样),之后把这个数组进行分组(以要算的数组为5为例)。第一个数到第五个数为一组,第二个数与第六个数为一组...第五个数到第九个数。分别把各组的子数组的最大值记录到另一个数组中。比较求出最大的子数组之和。
2.列出最大子数组:由于知道最大值在第二个数组的位置,所以输出那个位置上的原数组的值,之后依次输出后面数组的值,直到他们的和等于最大值。
代码:
#include<iostream> using namespace std; void main() { int n,i,a[100],x=0,b=0,sum,B[100],max,j,m,y; cout<<"输入数组的位数"; cin>>n; cout<<"输入"<<n<<"个数"; for(i=0;i<n;i++) { cin>>a[i]; a[n+i]=a[i]; } while(x<n) { sum=a[x]; for(i=x;i<n+x;i++) { if(b<0) b=a[i]; else { b+=a[i]; } if(sum<b) { sum=b; m=i; } } B[x]=sum; x=x+1; b=0; } max=B[0]; for(i=1;i<n;i++) { if(B[i]>max&&a[i]>0) { max=B[i]; j=i; } } cout<<max<<" "<<"从第"<<j+1<<"个数开始"<<endl; //输出字数组。 y=a[j]; m=j; for(i=j+1;i<j+n;i++) { if(y==max)break; else { y=y+a[i]; m=m+1; } } for(i=j;i<=m;i++) { cout<<a[i]<<" "; } }
截图:
总结:
通过这次试验,使我们之间的配合更加默契,我们之间更加了解,同时,我也发现了自身的不足,如不重视编码规范,变量名称随意等。
我相信在以后的合作中,我会发现自己更多的不足并加以改正,是自己的编程水平有所提高。