【软件工程】解决求数组的子数组最大和问题

问题描述:求一个数组的子数组的最大和,并且标出数组的具体取值问。

举例:

有一数组:arr[5]={-4,5,6,-2,9},则它的子数组的和最大值为arr[2]到arr[3]的和。

编程语言:c语言

程序代码:

// 20140310.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

int main(int argc, char* argv[])
{
    int arr[100],sum,k;
    int max,first,last;
    printf("请输入数组的数字个数:");
    scanf("%d",&k);
    printf("请输入数组的内容:");
    for(int i=0;i<k;i++)
    {
        scanf("%d",&arr[i]);
    }

    sum=max=arr[0];

    for(int j=0;j<k;j++)
    {
        sum=arr[j];
        for(i=j;i<k;i++)
        {
        
            if(i!=j)
            {
                sum=sum+arr[i];
                if(sum>max)
                {
                    max=sum;
                    first=j;
                    last=i;
                }
            }
            else
            {
                if(arr[i]>max)
                {
                    max=arr[i];
                    first=j;
                    last=i;
                }
            }
        }
    }

    printf("数组arr[%d]-arr[%d]的和最大,最大值为:%d\n",first,last,max);

    //printf("Hello World!\n");
    return 0;
}

运行实例:

 

这个的程序代码为课上老师作为结对开发的例子。两个人一起写程序,两者分别作为写代码和监督逻辑思维代码规范。

这次是我&张博两个人的结对开发。开始阶段我们讨论了这个程序的实现原理,等到我们有具体思路后,我们开始讨论实现的细节。开始本来想使用一个结构体来存储每次计算的和,但是程序是需要最大值,我们就舍去,采取的最简单的max值的方法。经过多次的修改,我们最后完成了程序。

开始的代码:

for(int j=0;j<k;j++)
    {
        for(i=j+1;i<k;i++)
        {
        
            if(i!=j)
            {
                sum=arr[j]+arr[i];
                if(sum>max)
                {
                    max=sum;
                    first=j;
                    last=i;
                }
            }
            //sum=arr[j];
        }
    }

可以看出上面的代码,没有考虑到单个数组值的情况,在这样的情况下,如果最后一个数组值是最大值,那么程序就会报错,得不到正确结果。在程序复审的阶段,我们一起讨论了这个问题。

转载于:https://www.cnblogs.com/renguoqing/p/3591887.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值