标签:
一.题目:
在原有的一位数组上进行扩展,求首尾相连的最大子数组的和:
二.要求:
1)输入一个一维整形数组,数组里有正数也有负数。
2)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
3) 求所有子数组的和的最大值。
4) 结对编程要求: 两人结对完成编程任务。 一人主要负责程序分析,一人负责代码编程代码复审和代码测试计划。发表一篇博客文章讲述两人合作中的过程、体会以及如何解决冲突(附结对开发的工作照)。
三.组员:孔维春 崔鹏勃
四.思路分析:
这次的编程开发是基于上次的一维数组,我和崔鹏勃(id:春宵一刻)开始了认真的讨论,再结合课堂上的同学讨论,如何能在一维数组原有的基础上,加上首尾相连这个条件,同时降低时间复杂度,这种方法的大概思想是:遍历数组里面的每一个数将第一个数变为最后一个数,具体算法为 a[i-1]=a[i],这样又变成了一个新的一维数组,输出每个数组的最大子数组和,然后比较每个输出的和,找出最大的数。
五.源代码:
#include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { return 0; } #include<iostream> using namespace std; int maxSum(int* a, int n) //定义一个求一维数组的最大子数组和的方法 { int sum = 0; int b = 0; for (int i = 0; i<n; i++) { if (b<0) b = a[i]; else b += a[i]; if (sum<b) sum = b; } return sum; } int main() { int n, temp, b; int sum = 0; int i; int a1, a2; cout << "请输入数组长度: " << endl; cin >> n; cout << "请输入数组的每个元素(空格隔开): " << endl; int *a = new int[n]; for (i = 0; i<n; i++) { cin >> a[i]; } cout << "此首尾相连的数组中最大子数组的和有以下几种情况:" << endl; cout << "第1种方式:" << endl; for (i = 0; i<n; i++) { cout << a[i] << " "; } cout << "所求最大子数组和为:" << maxSum(a, n) << endl; a1 = maxSum(a, n); for (b = 1; b<n; b++) { temp = a[0]; for (i = 1; i <= n; i++) { a[i - 1] = a[i]; } a[n - 1] = temp; cout << "第" << b + 1 << "种方式:" << endl; for (i = 0; i<n; i++) { cout << a[i] << " "; } cout << "最大子数组和为:" << maxSum(a, n) << endl; if (maxSum(a, n) >= sum) { sum = maxSum(a, n); } } a2 = sum; cout << endl; if (a1 >= a2) { cout << "综上所述,最大的子数组和为:" << a1 << endl; } else { cout << "综上所述,最大的子数组和为:" << a2 << endl; } system("pause"); return 0; }
六.结果截图:
七.总结:
这次开发增强了我的团队合作能力,受益匪浅。
标签:
原文地址:http://www.cnblogs.com/littilsaber/p/4379411.html