题目(1):最大连续子数组和(最大子段和)
问题: 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n
例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20。
-- 引用自《百度百科》
[coding地址](https://dev.tencent.com/u/zhoucysw)<-----代码在这里_;
算法设计以及实现过程:
-
算法设计描述:在输入数组以及数组个数之后,定义了数组和与最大子段和都为0,循环计算,如果数组和大于最大子段和,就把数组和赋值给最大子段和,反之,最大子段和不变。
-
流程图:
-
源代码:
#include<iostream> using namespace std; int max(int a[], int n) { int maxsum,sum = maxsum = 0; int i; for (i = 0; i < n; i++) { sum += a[i]; if (sum > maxsum) maxsum = sum; else if (sum < 0) sum = 0; } return maxsum; } int main() { int i, n; int num[100]; cin >> n; for (i = 0; i < n; i++) { cin >> num[i]; } int maxsum = max(num, n); cout << maxsum<< endl; system("pause"); }
-
源代码编译:
-
测试代码:
#include "stdafx.h" #include "CppUnitTest.h" #include"..work3 1.h" using namespace Microsoft::VisualStudio::CppUnitTestFramework; namespace UnitTest3 { TEST_CLASS(UnitTest1) { public: TEST_METHOD(TestMethod1) { int a[] = { 2,11,4,13,5,-2 }; int b = max(a, 6); Assert::AreEqual(33, b); // TODO: 在此输入测试代码 } }; }
-
测试代码编译:
-
条件判定测试:
-
数组为空:当数组为空时,最大子段和应该为0;
-
数组全为负数:当数组全为负数时,最大子段和为0;
-
数组全为正数:当数组全为正数时,最大子段和为数组和;
-
sum>maxsum:当数组和大于最大子段和时,最大子段和等于数组和;
-
sum<maxsum:当数组和小于最大子段和时,最大子段和保持不变;
-
- 总结:在这次的个人作业中,是一个完整的代码实现过程,在测试代码的过程中用到了单元测试,经过上一次的练习,这次再使用起来得心应手多了。单元测试是一个软件测试必经之路,虽然这次测试的代码不算很难,测试起来很容易覆盖到,但是这是一个培养思维方式的过程,相信经过不断强化的练习,会慢慢的积累不少的经验。