课堂练习四: 返回一个整数数组中最大子数组的和。

讨论过程(设计思想)
1.1数据分组n组
1.2将分组后前n-1个数组求和,然后第n组求和,排除不能整除的可能输出
1.3将n组数组的和进行比较大小,将最大值输出

源代码

#include<iostream>
#include<time.h>
using namespace std;
void RandIn(int IntNum,int A[])
{
	int IntCont;
	cout<<"整数内容"<<endl;
	for(int i=0;i<IntNum;i++)
	{
		IntCont=-(int)rand()%201+100;
		A[i]=IntCont;
		cout<<A[i];
		if(i%5==4)
			cout<<endl;
		else
			cout<<'\t';
	}
}
void DivANum(int IntNum,int SubANum,int sum[],int A[])
{
	int i,max;
    int	ArrayNum=0;
	for(i=0;i<IntNum-SubANum;i+=SubANum)
	{
		sum[ArrayNum]=0;
		for(int j=i;j<i+SubANum;j++)
		{
			sum[ArrayNum]+=A[j];
		}
		cout<<sum[ArrayNum];
		if(ArrayNum%5==4)
		cout<<endl;
		else
			cout<<'\t';
		ArrayNum++;
	}
	sum[ArrayNum]=0;
	for(int j=i;j<IntNum;j++)
	{
		sum[ArrayNum]+=A[j];
	}
	cout<<sum[ArrayNum];
	cout<<endl;

	max=sum[0];
	for(i=0;i<=ArrayNum;i++)
	{
		if(max<sum[i])
		{
			max=sum[i];
		}
	}
	cout<<"max="<<max<<endl;
}
void main()
{
	srand((unsigned)time(NULL));
	int A[10000],IntNum,SubANum,sum[10000],p=1;
	while(p==1)
	{
		cout<<"请输入整数的个数:";
		cin>>IntNum;
		RandIn(IntNum,A);
		cout<<endl;
		cout<<"请输入划分组成员个数";
		cin>>SubANum;
		DivANum(IntNum,SubANum,sum,A);
		cout<<"是否继续测试(输入1则继续否则退出)";
		cin>>p;
	}
}

程序截图

团队照片

试验总结

结对编程能够找出更多的bug,加快了程序的进度和准确性,通过本次实验我受益良多,对团队合作有了更深的认识

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

程序更改

改前说明

在此附上题目

题目:返回一个整数数组中最大子数组的和。
要求:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。

由于没有看题目只是听老师说要分组,就以为只要划分分组求最值就可以了,就过出现了这样一个很令人尴尬的程序

在此附上最新的解题思路,至于可取度有待考量

设计思想

由于要求o(n)的复杂度且只要求求出最大和,所以采用两个变量来记录求和sum和buffer,buffer对连续的数进行求和,和大于0则继续累加,但将过程中每一次的和与sum比较,sum初始化为0,用sum记录最大的和,当buffer出现负数时抛弃此时的buffer和,buffer置零,继续对buffer求和,下一个数如果还是负数,buffer再次得到负数,继续抛弃,重置,直到将数组遍历一遍为止

源代码

#include<iostream>
#include<time.h>
#include<conio.h>
#define N 1000
using namespace std;
void RandIn(int IntNum,int A[])
{
	cout<<"整数内容"<<endl;
	for(int i=0;i<IntNum;i++)
	{
		A[i]=-(int)rand()%201+100;
		cout<<A[i];
		if(i%5==4)
			cout<<endl;
		else
			cout<<'\t';
	}
}
void SelMax(int IntNum,int A[],	int &sum)
{
	int buffer=0;//引入一个常量记录累加的和
	for(int j=0;j<IntNum;j++)
	{
		buffer+=A[j];
		if(buffer<0)//如果累加和小于0,buffer重新初始化为0
		{
			buffer=0;
		}
		if(sum<buffer)//sum始终记录下存在的最大和
		{
			sum=buffer;
		}
	}
}
void main()
{
	
	int IntNum;
	int A[N];
	int q=0;
	while(q==0)
	{
		int sum=0;
		srand((unsigned)time(NULL));
		cout<<"请输入整数的个数:";
		cin>>IntNum;
		RandIn(IntNum,A);
		SelMax(IntNum,A,sum);
		cout<<endl;
		cout<<sum<<endl;
		cout<<"是否继续测试(输入0则继续否则停止)";
		cin>>q;
		system("cls");
	}
}

 截图

实验总结

严谨的设计思想才是好程序的灵魂,与之相比,编写程序相形见绌。

 

posted @ 2015-03-19 13:07  菜鸟骑士  阅读(140)  评论(0编辑  收藏  举报