软件工程结队开发——输出一个数组中最大子数组的和
一、题目及要求
题目:返回一个整数数组中最大子数组的和。
要求: 输入一个整型数组,数组里有正数也有负数;
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和;
求所有子数组的和的最大值。要求时间复杂度为O(n);
二、设计思路
程序分成两个部分:
- (1):找到数组中所有可能的子数组的和;
先从数组中第一个数开始算起,一直求到与它连续的的所有数的和存入数组son,然后从第二个数开始算起,求与它连续的数的和存入数组,以此类推,直至计算到最后一个数。有n个数据的数组能产生的子数组个数为n*(n+1)/2
- (2)每次所求的和存入数组时,按照上一次所存数据的最后一个数据加一村入新数据
- (3)比较数组son[]中的值,然后输出最大的数即为所求
三、源代码
1 // ketang4.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include "iostream" 6 using namespace std; 7 8 9 /*确定求和存储数组元素*/ 10 void Son(int father[],int son[],int length) 11 { 12 int add; //定义求和变量 13 int count=0; //统计数组元素个数 14 for(int i=0;i<length;i++) 15 { 16 add=0; 17 for(int j=0;j<length-i;j++) 18 { 19 add=add+father[i+j]; 20 son[count+j]=add; 21 } 22 count=count+length-i; 23 } 24 } 25 26 /*找到最大的子数组的和*/ 27 void Max(int son[],int num) 28 { 29 int max=son[0]; 30 for(int i=0;i<num;i++) 31 { 32 if(max<son[i]) 33 { 34 max=son[i]; 35 } 36 } 37 cout<<max<<endl; 38 } 39 40 /*主函数*/ 41 int main() 42 { 43 int length,num; //定义原始数组长度length,求和存储数组长度num 44 cout<<"请输入数组元素个数:"; 45 cin>>length; 46 int* father=new int[length]; //定义原始数组 47 num=length*(length+1)/2; 48 int* son=new int[num]; //定义求和存储数组 49 cout<<"请输入原始数组数据:"<<endl; 50 for(int i=0;i<length;i++) 51 { 52 cin>>father[i]; 53 } 54 Son(father,son,length); 55 cout<<"最大子数组的和为:"; 56 Max(son,num); 57 return 0; 58 }
四、实验结果
五、实验分析
这可以算的上是第一次结队开发了吧,以前真的没有几个人在一块讨论实现问题,虽然以前也有过分组的实验之类的课程作业,但是,最多刚开始讨论一下,之后不了了之了,所有东西都是自己在做,自己想到什么是什么,不会顾及别人的想法。在我和梁世豪一起做这道题的时候,对这道题有不同的想法,但是经过思考,决定选取上面这种解法,虽然没有实现复杂度为o(n),但还是达到了两个人预期的结果。虽然这个程序很短,但是两个人在完成过程中,有交流和分析,可以知道对方的想法思路,可以拓宽自己的思维,取得1+1>2的效果。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。