一、题目要求
题目:返回一个整数数组中最大子数组的和。
要求: 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。 同时返回最大子数组的位置。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
结对编程要求: 两人结对完成编程任务。
一人主要负责程序分析,代码编程。 一人负责代码复审和代码测试计划。
发表一篇博客文章讲述设计思想,出现的问题,可能的解决方案(多选)、源代码、结果截图、总结。
(截止时间4月15日晚18:00之前)
二、设计思路
本次合作设计思路非常的简单易懂,即第一次以数组的第一个元素为字数组的第一个元素,依次往下加,第二轮以数组的第二个元素为字数组的第一个元素,再依次往下加,原来数组的第一个元素设置为最后一个元素。以此类推,即每次将数组的最后一个元素当做数组的第一个元素这样就形成了循环数组。
三、代码
#include<iostream> #include<time.h> #define n 5 using namespace std; void main() { int a[n],i,j,w=0,b[n][n],p1=0,p2=0,t,m; srand((int)time(0)); //数组的元素值由随机函数产生 for(i=0;i<n;i++) { a[i]=-rand()%36+25; } //输出数组的元素值 for(i=0;i<n;i++) { cout<<a[i]<<endl; } //求子数组 for(i=0;i<n;i++) { m=i; w=0; j=0; while(j<=n-1) { w+=a[m]; b[i][j]=w; m++; if(m>n-1) { m=0; } j++; } } t=b[0][0]; for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(b[i][j]>t) { t=b[i][j]; p1=i; p2=j; } } } cout<<"最大子数组的值为:"<<t<<endl; cout<<"子数组中元素的下标为:"<<endl; i=0; while(i<=p2) { cout<<p1<<" "; p1++; if(p1>=n) { p1=0; } i++; } cout<<endl; }
四、运行效果截图
五、总结
写程序的过程让我收获颇丰,思考问题有时候换另一种思路可能会收获更好的效果,一开始的思路是不移动数据,而是改变循环条件,但经过实际操作后我发现这种方法太复杂,于是经过思考就有了现在这样的思路。更多的思考会让人有更多的收获。两个人的合作也相比之前更加融洽。我们会再接再厉。
六、工作照