您的位置:首页 > 其它

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

2015-03-19 13:07 316 查看
讨论过程(设计思想)
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
;
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");
}
}


 截图





实验总结

严谨的设计思想才是好程序的灵魂,与之相比,编写程序相形见绌。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: