一.题目:
在原有的一位数组上进行扩展,求首尾相连的最大子数组的和:
二.要求:
1)输入一个一维整形数组,数组里有正数也有负数。
2)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
3) 求所有子数组的和的最大值。
4) 结对编程要求: 两人结对完成编程任务。 一人主要负责程序分析,一人负责代码编程代码复审和代码测试计划。发表一篇博客文章讲述两人合作中的过程、体会以及如何解决冲突(附结对开发的工作照)。
三.组员:孔维春 崔鹏勃
四.思路分析:
这次的编程开发是基于上次的一维数组,我和崔鹏勃(id:春宵一刻)开始了认真的讨论,再结合课堂上的同学讨论,如何能在一维数组原有的基础上,加上首尾相连这个条件,同时降低时间复杂度,这种方法的大概思想是:遍历数组里面的每一个数将第一个数变为最后一个数,具体算法为 a[i-1]=a[i],这样又变成了一个新的一维数组,输出每个数组的最大子数组和,然后比较每个输出的和,找出最大的数。
五.源代码:
1 #include "stdafx.h" 2 int _tmain(int argc, _TCHAR* argv[]) 3 { 4 return 0; 5 } 6 #include<iostream> 7 using namespace std; 8 int maxSum(int* a, int n) //定义一个求一维数组的最大子数组和的方法 9 { 10 int sum = 0; 11 12 int b = 0; 13 14 for (int i = 0; i<n; i++) 15 { 16 if (b<0) 17 b = a[i]; 18 else 19 b += a[i]; 20 if (sum<b) 21 sum = b; 22 } 23 return sum; 24 } 25 26 int main() 27 { 28 int n, temp, b; 29 int sum = 0; 30 int i; 31 int a1, a2; 32 cout << "请输入数组长度: " << endl; 33 cin >> n; 34 cout << "请输入数组的每个元素(空格隔开): " << endl; 35 int *a = new int[n]; 36 37 for (i = 0; i<n; i++) 38 { 39 cin >> a[i]; 40 } 41 cout << "此首尾相连的数组中最大子数组的和有以下几种情况:" << endl; 42 cout << "第1种方式:" << endl; 43 for (i = 0; i<n; i++) 44 { 45 cout << a[i] << " "; 46 } 47 cout << "所求最大子数组和为:" << maxSum(a, n) << endl; 48 a1 = maxSum(a, n); 49 for (b = 1; b<n; b++) 50 { 51 temp = a[0]; 52 for (i = 1; i <= n; i++) 53 { 54 a[i - 1] = a[i]; 55 56 } 57 a[n - 1] = temp; 58 cout << "第" << b + 1 << "种方式:" << endl; 59 for (i = 0; i<n; i++) 60 { 61 cout << a[i] << " "; 62 } 63 cout << "最大子数组和为:" << maxSum(a, n) << endl; 64 if (maxSum(a, n) >= sum) 65 { 66 sum = maxSum(a, n); 67 } 68 } 69 a2 = sum; 70 cout << endl; 71 if (a1 >= a2) 72 { 73 cout << "综上所述,最大的子数组和为:" << a1 << endl; 74 } 75 else 76 { 77 cout << "综上所述,最大的子数组和为:" << a2 << endl; 78 } 79 system("pause"); 80 return 0; 81 }
六、运行截图
七、感想
增进了我们对彼此的了解,使我们配合稍显默契。
八、真象图