讨论过程(设计思想)
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<<' '; } } 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<<' '; 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<<' '; } } 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"); } }
截图
实验总结
严谨的设计思想才是好程序的灵魂,与之相比,编写程序相形见绌。