所选题目:求最大字段和
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。
-- 引用自《百度百科》
2.算法设计及流程图
- 算法描述:
- 1.先定义一个最大字段和变量sum,初始化为零,再实行三重循环求出各个字段和的值partsum,将所求出的partsum与sum逐个比较,将最大的值保留在sum内,并将值返回给函数。
- 2.参考代码及算法
- 3.可运行代码主要函数部分
int judge_maxsum(int a[]){
int sum=0;
int i,j,k;
for(i=0;i<sizeof(a);i++)
{
for(j=i;j<sizeof(a);j++)
{
int partsum=0;
for(k=i;k<=j;k++)
{
partsum+=a[k];
}
if(partsum>sum)
{
sum=partsum;
}
}
}
return sum;
}
- 流程图如下:
3.测试结果
- 选择测试方法:判定覆盖
- 判定覆盖是设计足够多的测试用例,使得程序中的每一个判断至少获得一次"真"和一次"假",即使得程序流程图中的每一个真假分支至少被执行一次。
- 判定条件:
1.首先判定flag是否等于数组的长度,若等于则说明全为负数,最大字段和为零,否则求出实际最大字段和。
2.其次判定partsum的值是否大于当前已求字段和的值,若大于,则将当前partsum的值赋给sum,若小于则循环继续往下走。
3.测试实例:
(1)全为负数时,flag=6的情况:a[6]={-3,-5,-6,-9,-7,-8}
(2)partsum值大于及小于sum值的情况:a[6]= - 测试数据及结果如图
程序代码链接:https://git.coding.net/lymiou1505_3/san.git