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

题目:求一维子数组的最大子数组之和(一维数组首尾相接)并写出子数组

人员

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

  王颖瑞:编写代码

思路

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

 

 截图:

 

总结:

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

我相信在以后的合作中,我会发现自己更多的不足并加以改正,是自己的编程水平有所提高。

posted @ 2015-04-13 16:28  乱——清——无  阅读(417)  评论(1编辑  收藏  举报