一维环状最大子数组和

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

组员:

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

王颖瑞:编写代码

思路:

本次的任务要求一维数组首尾相连情况下求最大子数组的和,首尾相连计算的长度最大为原本数组长度的2倍,所以首先把数组输入时让2倍的数组长度的部分与数组前的数一一对应相等,在计算子数组最大和时利用循环要让数组长度一直保持在用一维数组求子数组最大和的方法,求每个数组长度的最大子数组和并记录在一一与后边的比较最后求得最大。

代码:

#include<iostream>
#include<cmath>
using namespace std;

void main()
{
	int a[100],b=0,s,i,n,l=0,j,m,max,B[100],x=0,y;
	cout<<"输入数组长度";
	cin>>n;
	for(i=0;i<n;i++)
	{
		cin>>a[i];
		a[i+n]=a[i];
	}
	s=a[0];
	for(i=0;i<n;i++) //求子数组和最大值
	{ 
		for (j=i;j<i+n;j++)
		{
			if(b<0)
				b=a[j];  
			else 
			{
				b+=a[j];
			}
			if(s<=b)  
			{
				s=b; 
				m=j;
			}
		}
		B[x]=s;
		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-15 11:06  零夕  阅读(315)  评论(1编辑  收藏  举报