合作项目4
结组成员:信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

五、心得体会
因为项目3实现了定位,这次就容易些。合作越来越默契。
结组成员照片:


浙公网安备 33010602011771号