最大连续子数和

一、问题描述及分析

  • 问题描述

给定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。

  • 问题分析
    该问题需要考虑两种情况:第一种是输入全为负时,则输出0;第二种是有正有负或全为正时输出最大连续子数和。
    我们可以定义一个Max代表最大的连续子数和,且Max初值为0;同时定义Sum,利用两层嵌套循环,从第i个数组元素开始遍历(i>=0)到最后一个元素并进行累加,将累加值赋予Sum(这里需注意:每进行一次外层循环,就需要给Sum赋初值0),每进行一次累加就将Sum值与Max值相比较,若Sum>Max,则将Sum值赋予Max,否则Max值不变;循环结束后 输出Max,即为所求值

二、相关代码分析

  • 相关代码
#include<stdio.h>
#include<stdlib.h>
int Summax(int a[],int num)
{
	int max=0,sum,i,j;
   for(i=0;i<num;i++)
   {
	   sum=0;
	   for(j=i;j<num;j++)
	   {
	   sum=sum+a[j];
	   if(sum>max)
	   {
		   max=sum;
	   }
   }
	  
 }
    return max;
}
int main ()
{
	int a[50],n,i,max=0;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{ 
		scanf("%d",&a[i]);
	}
	max=Summax(a,n);
	printf("最大字段和为:%d\n",max);
	system("pause");
	return 0;
}

三、运行结果及单元测试

  • 运行结果

  • 单元测试
    我选择的是判定条件覆盖
    第一组测试数据为:num=6,a[6]={-1,-2,-4,-6,-7,-2};路径为abcdefhjk
    第二组测试数据为:num=6,a[6]={-2,11,-4,13,-5,-2};路径为abcdefgijk
    测试代码如下:
[TestMethod]
		void TestMethod1()
		{
			int Max=0,i,j,sum;
			int num=6;
			array<int> ^a={-1,-2,-4,-6,-7,-2};
			 for(i=0;i<num;i++)
           {
	         sum=0;
	         for(j=i;j<num;j++)
	       {
	          sum=sum+a[j];
	         if(sum>Max)
	        {
		    Max=sum;
	        }
           }
	  
         }
			Assert::AreEqual(Max,0);
	   };
       [TestMethod]
		void TestMethod2()
		{
			int Max=0,i,j,sum;
			int num=6;
			array<int> ^a={-2,11,-4,13,-5,-2};
			 for(i=0;i<num;i++)
           {
	         sum=0;
	         for(j=i;j<num;j++)
	       {
	          sum=sum+a[j];
	         if(sum>Max)
	        {
		    Max=sum;
	        }
           }
	  
         }
			Assert::AreEqual(Max,20);
	   };

测试结果: