所选题目:求最大字段和

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
posted on 2018-03-29 21:59  lymiou1505_3  阅读(147)  评论(0编辑  收藏  举报