软件工程第三次作业

最大连续子数组和(最大子段和)

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. 环境

开发工具:eclipse
语言:JAVA


3. 设计思路

用数组存放数列,根据子数组第一位的位置与该子数组的长度得到子段和,将所有字段和中最大的数保存下来。

定义元素作用
n数列的总长度
a[ ] 数列
m(n,a[ ]) 子函数,返回值为最大子段和
a[i] 数列第(i+1)个元素
S子段和
MAX已得出的最大字段和

4. 编写代码

  • 子函数 m(根据已有的数列长度n与数列数组a[ ]求出最大子段和MAX)
public static int m(int n,int a[]) {
        int i,j,MAX=0,S=0;
        for(i=0;i<n;i++)
        {
            for(j=0;j<n-i;j++)
            {
                S=S+a[i+j];
                if(MAX<S) MAX=S;
            }
            S=0;
        }
        return MAX;
    }
  • 主函数 main(输入数列长度n与数列数组a[ ]并调用子函数m,输出最大子段和)
public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner scanner = new Scanner (System.in);
        System.out.println("请输入数列长度,按回车结束:\n");
        int n=scanner.nextInt();
        System.out.println("请输入数列,以空格隔开,回车结束:\n");
        int [] a = new int[50];
        for(int i=0; i<n; i++){
            a[i] = scanner.nextInt();
        }
        int MAXCOUNT=m(n,a);
        System.out.println(+MAXCOUNT);
    }

5. 代码测试

  • 测试用例
    测试数据为3组,全负整数、全正整数与正负整数交替,满足语句覆盖、条件覆盖。
public class MAXSUMtext {

    @Test
    public void AAMAX1() {
        int aa[]=new int[]{-1,-2,-3,-4,-5};
        int bb=new MAX1.MAXSUM().m(5, aa);
        assertEquals(0,bb);
    }
    
    @Test
    public void AAMAX2() {
        int aa[]=new int[]{1,2,3,4,5};
        int bb=new MAX1.MAXSUM().m(5, aa);
        assertEquals(15,bb);
    }
    
    @Test
    public void AAMAX3() {
        int aa[]=new int[]{-2,11,-4,13,-5,-2};
        int bb=new MAX1.MAXSUM().m(6, aa);
        assertEquals(20,bb);
    }

}
  • 测试结果
    925190-20180330221851410-1078642589.png
    结果正确

  • 加入主函数的手动输入测试
    925190-20180330221900617-342868361.png
    结果正确

[代码](https://coding.net/u/ry2954/p/maxsum/git/blob/master/.gitignore?public=true)


转载于:https://www.cnblogs.com/memory-sword/p/8678958.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值