《团队开发一(求一个数组的连续的子数组之和的最大值)》
《团队开发一(求一个数组的连续的子数组之和的最大值)》
(1)设计思想:一般的,求一个数组的最大子数组之和即是按数组顺序依次让前几个数的和与下一个数进行比较,设一变量来装每次比较后的较大的数,依此进行到数组终端;但是考虑到求的是连续的子数组,则应该想到除了在按顺序上的连续外,还得考虑到末端与首端的连续,所以按数组顺序依次求解得到的未必就是连续的最大的子数组之和,故此必须在此种情况下也求解出最大子数组之和,方法即是同时从数组的两端依次进行求出各自的最大子数组之和,然后在相遇前求和后与之前所求的最大子数组之和依次相比较,取它们中最大的一个作为连续的最大子数组之和即可。(因为单独从一端所求出的最大子数组之和绝对大于两边同时进行的其中一边所求出的最大字数之和,故保证了程序的非冗余性。)
(2)出现的问题:
a:用户输入的数组长度与计算机的内存空间分配有冲突:例如不允许数组长度为0,复数,大于与计算机协调的内存空间或大于数组范围为空间;
b:用户输入的上下限不符合逻辑要求,例如下限大于上限,下限或上限超过整型数的范围;
(3)可能解决的方案:对于以上两种情况,只需要在用户与系统界面相交互的时候,设置相应的测试函数,用户再跟据系统的提示一步步进行即可;
(4)源代码:
//求一个数组的连续的最大子数组之和 //李敏,Mar 22th #include <iostream> #include <time.h> using namespace std; int main() { int n, i, j, k,a[1500],b,c; char mm; do { cout<<"请输入数组长度:"<<endl; cin >> n; //检测输入数组长度的合法性 cout<<"请分别输入两个数作为数组范围的限制,其中第一个数为下限,第一个数为上限:"<<endl; cin>>b>>c; if(n==0||n<0||n>1500||n>c-b) { cout<<"输入的数组长度不合法,请重新输入!"<<endl; cin>>n; } //检测输入数组范围的合法性 if(b>c||(b<-2147483648||b==-2147483648)||c==2147483647) { cout<<"输入的数字不合法,请重新输入:"<<endl; cin>>b>>c; } srand( (unsigned)time( NULL ) ); //srand()函数产生一个以当前时间开始的随机种子 for (i=0; i<n; i++) { a[i]=b+rand()%(c-b+1); } cout<<"系统产生的随机数为:"<<endl; for (i=0; i<n; i++) { cout<<a[i]<<'\t'; } //依次按数组的顺序求出当前子数组的最大和 int t = a[0]; int sum = t; for (k=1; k<n; k++) { t = max(a[k],t+a[k]); sum = max(sum, t); } //考虑到数组的连续(即数组可形象化为一个圈),故分别从数组首端和末端同时进行以求出两端还未相遇前的各自的最大子数组之和 int s = a[0]; for (i=1; i<n && s+a[i]>s; i++) s += a[i]; t = a[n]; for (j=n-1; j>=1 && t+a[j]>t; j--) t += a[j]; //依次比较两端数组还未相遇前的两个最大子数组之和的和与之前按数组顺序求出的最大子数组之和 if (i<j && s+t> sum) sum = s+t; //取两种情况下的最大字数组之和即可 cout<<"最大字数组之和为:"<<sum<<endl; cout<<endl; cout<<"*************************************************************"<<endl; cout<<" 继续请输入Y 退出请输入N "<<endl; cout<<"*************************************************************"<<endl; cin>>mm; } while(mm=='y'||mm=='Y'); }
(4)实验截图:
(6)总结:团队开发其实是一个很好的开发模式,我们可以结对从互相彼此那汲取到有利自己的东西, 以及增强了自己的合作意识,对于一个难以解决的问题,一个人总是孤立无援的,但是如果融合了两个人的解决措施,即使再难的问题也能够分而治之,从而解之,故我们应该积极的投入到项目开发团队中。
合作团队:李敏 刘子晗