结组成员:信1201-1柴珏辉 信1201-2邓锐
一、要求
1、题目:
返回一个整数数组中最大子数组的和。
2、要求:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。
同时返回最大子数组的位置。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
3、结对开发要求:
两人结对完成编程任务。
一人主要负责程序分析,代码编程。
一人负责代码复审和代码测试计划。
发表一篇博客文章讲述两人合作中的过程、体会以及如何解决冲突(附结对开发的工作照)。
二、设计思路
我们合作项目3中的代码中已实现子数组定位。首尾相邻方面,在这个数组最后一个元素后面重复一遍数组以实现环状数组,计算求和时,数组长度为n,子数组第一个数的位置为a(a<=n),第二个数的位置为b(a<=b<a+n),以实现不重复。
三、程序代码
1 #include<iostream.h> 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<time.h> 5 #define N 30 6 int qiuhe(int a[],int i,int j) //数组求和 7 { 8 int he=0,b; 9 for(b=i;b<=j;b++) 10 { 11 he=he+a[b]; 12 } 13 return he; 14 } 15 void show(int a[],int i,int j )//显示方式 16 { 17 int b; 18 for(b=i;b<=j;b++) 19 { 20 if(b%20==0) 21 {cout<<endl;} 22 cout<<a[b]<<" "; 23 } 24 cout<<endl; 25 } 26 void main() 27 { 28 int yuan[N*2]; 29 int i,j,ra,p=0,shu1,shu2,max; 30 srand((unsigned)time(NULL)); 31 for(i=0;i<N;i++) 32 { 33 yuan[i]=(rand()%20)-10; 34 yuan[i+N]=yuan[i]; //重复生成一遍数组 35 } 36 i=0; 37 j=0; 38 max=yuan[0]; 39 shu1=0; 40 shu2=0; 41 for(i=0;i<N;i++) //找最大值 42 { 43 for(j=i;j<i+N;j++) 44 { 45 if(qiuhe(yuan,i,j)>max) 46 { 47 max=qiuhe(yuan,i,j); 48 shu1=i; 49 shu2=j; 50 } 51 } 52 } 53 cout<<"原数组:"; 54 show(yuan,0,N-1); 55 cout<<"最大子数组:"; 56 show(yuan,shu1,shu2); 57 cout<<"从第"<<shu1+1<<"个数到第"; 58 if(shu2>N-1) 59 { 60 cout<<shu2+1-N; 61 } 62 else 63 { 64 cout<<shu2+1; 65 } 66 cout<<"个数,形成的子数组和最大"<<endl; 67 cout<<"最大值:"; 68 cout<<max<<endl; 69 70 }
截图:
四、测试
1.数组数量 1000
2.数据大小yuan[i]=(rand()%2000)-1000
五、心得体会
第四个合作项目,在原有基础上实现,较为容易,合作默契度加深。
结组成员照片: