您的位置:首页 > 其它

数组中子数组之和最大值(首尾相接)

2015-04-13 16:28 225 查看
题目:求一维子数组的最大子数组之和(一维数组首尾相接)并写出子数组

人员

  陈晨:程序复查,结果测试。  

  王颖瑞:编写代码

思路

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]<<" ";
}
}


截图:



总结:

通过这次试验,使我们之间的配合更加默契,我们之间更加了解,同时,我也发现了自身的不足,如不重视编码规范,变量名称随意等。

我相信在以后的合作中,我会发现自己更多的不足并加以改正,是自己的编程水平有所提高。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: