课堂练习----一个整数数组中最大子数组的和(2)

题目:

    返回一个整数数组中最大子数组的和。

要求:

    输入一个整形数组,数组里有正数也有负数。

    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

    如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大。

    同时返回最大子数组的位置。 求所有子数组的和的最大值。

设计思想:

    这个题目是在上个题目的基础的加上数组首位相连,并该数组最大子数组的和,实现方法就是把环变成直线的方法,通过for循环,在每次循环中,把数组中的元素作为数组的起始位置,并把后面的元素依次放到另外一个数组中。对于新生成的数组,通过上一次的方法求出新数组的最大子数组的和,然后通过比较所有数组的最大子数组和,求出初始数组最大子数组的和。

2 4 7 -10

4 7 -10 2

7 -10 2 4

-10 2 4 7

代码:

#include<iostream>
using namespace std;
#define N 100
int main()
{
    int p,num,value,max,count=0;     
    int val[N];                                      //原始数组
    int Array[N];                                      //存放新生成的数组
    int ArrayMax[N];                                   //存放每个数组最大值
    int ArrayFisrtLast[N][N];                          //存放最大子数组的每个元素
    int ArrayNum[N][N];                               //存放最大子数组元素的个数
    cout<<"输入数的个数:";
    cin>>num;
    for(int i=0;i<num;i++)                             //输入元素
    {
        cin>>val[i];
    }
    for(int i=0;i<num;i++)
    { 
        int firstNum=0,lastNum=0,q=0;                   //最大子数组开始位置(firstNum),结束的位置(lastNum)
        value=0;
        p=i;
        for(int k=0;k<num;k++)                           //重新开辟一个新数组Array,存放以原始数组的每个元素开头的数组
        {
            p=p%num;
            Array[k]=val[p];
            p++;
        }
        max=0;
        for(int j=0;j<num;j++)                              //找出最大子数组
        {
            value=value+Array[j];  
            if(value>max)                                      //累加和大于max,累加和赋值给max              
            {
                max=value;
                lastNum=j;
            } 
            if(value<0)                                // 当前和小于0,重置为0  
            {
                value=0;
                firstNum=j+1;
            }
        }
        if(max<0)                                 // 最大和依然为0,说明数组中所有元素都为负值
        { 
            max=val[0];
            firstNum=0;
            lastNum=0;
            for(int j=0;j<num;j++)
            {
                if(max<Array[j])
                {
                    max=val[j];
                    firstNum=j;
                    lastNum=j;
                }
            }
        }
        ArrayMax[count]=max;
        for(int m=firstNum;m<=lastNum;m++)
         {
            ArrayFisrtLast[count][q]= Array[m];
            q++;
        }
        ArrayNum[count][0]=lastNum-firstNum+1;
        count++;
    }
    max=ArrayMax[0];
    int n=0;
    for(int i=0;i<count;i++)
    {
        if(max<ArrayMax[i])
        {
            max=ArrayMax[i];
            n=i;
        }
    }
    cout<<"最大子数组是:";
    for(int i=0;i<ArrayNum[n][0];i++)
    {
        cout<<ArrayFisrtLast[n][i]<<" ";
    }

    cout<<endl;
    cout<<"最大子数组的和为:";
    cout<<max<<endl;
    return 0;
}

 

截图:

 

总结:更加熟悉了数据结构与算法的学习,认为这门课程是非常重要的基础,要好好学习多加练习,更加熟悉两个人的结对开发,一起讨论,一起想解决方案,一起网上查找算法,更加锻炼了结对开发的能力。

项目计划总结:

日期&&任务听课编写程序阅读相关书籍网上查找资料日总计
周一100252515165
周二 30352590
周三 601535110
周四100303025185
周五 180 15195
周六  601575
周日  15 15
周总计200325180130835

时间记录日志  

 

日期开始时间结束时间中断时间净时间活动备注
3/2114:0015:5010100听课软件工程上课
 17:1017:20 10阅读书籍《构建之法》《梦断代码》
 21:0021:25 20网上查找资料 
3/2214:0015:0010110结对编程编写老师布置的作业
 16:0017:0010110看书《构建之法》《梦断代码》
3/2321:0021:30 30结对编程编写老师布置的作业
3/2414:0015:5010100听课软件工程上课
3/2516:0018:00 120结对编程编写老师布置的作业
3/269:009:30 30看书《构建之法》《梦断代码》
3/279:009:30 30看书《构建之法》《梦断代码》

 

缺陷记录日志:

       

 

 

日期编号类型引入阶段排除阶段修复时间修复缺陷
3月22日1 编码编码0.2min 
 缺少头文件
 2 编码运行3min 
 重复使用变量i,导致无限运行
3月25日3 编码编译1min 
 if条件中用了“=”运算符
 4 编码编译1min 
 缺少;
 5 编码编译0.2min 
 for的结尾再次使用i++,导致i加了两次

 

小组成员:杨超群 http://www.cnblogs.com/linumy/

转载于:https://www.cnblogs.com/GloryYT/p/5322996.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值