结对项目——可循环的最大子数组

求循环数组的最大子数组的和

一、程序要求

1、输入一个整数数组,数组中有正数也有负数;

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

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

4、同时返回最大子数组的位置。

二、程序设计思想

    此次要求的是求数组中间的某一段和最大,关键是求数组首尾相接的某一段元素的和最大,中间部分的和小于0,所以求出数组总和,然后减去这部分元素的和。求这部分的和的时候,将数组求反,用上次的方法求出就行,再加上数组的总和,即为所求。

三、源程序

 

//李俏、张莹荧,2016.3.26
//求整数数组的最大子数组的和,数组可循环 

#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;

typedef long long LL;

LL maxsum(int a[], int n)
{
    int i;
    int start=0,end=0;
    LL maxsum = 0;
    LL sum = 0;
    for(i=0; i<n; i++)
    {
        if(sum < 0) 
        {
            sum = a[i];
            //start= i + 1;
        }
        else 
        {
            sum += a[i]; 
        }

        if(sum>maxsum)
        {
            maxsum = sum;                
            //end = i;        
        }
        //maxsum = max(maxsum, sum);
    }
    //cout<<"起始位置:"<<start<<",终止位置:"<<end;
    return maxsum;
}

int main()
{
    int i;
    int arrlength;
    int arr[1000];
    LL sum = 0,sum1,sum2;

    cout<<"请输入数组长度:";
    cin>>arrlength;
    if(arr==NULL||arrlength==0)
    {
        //exit(1);
        return 0;
    }

    cout<<"请输入数组元素:";
    for(i=0;i<arrlength;i++)
    {
        cin>>arr[i];
        sum += arr[i];
    }

    sum1 = maxsum(arr, arrlength);

    for(int i=0; i<arrlength; i++)//每个数求反
    {
        arr[i] = -arr[i];
    }   
    sum2 = maxsum(arr, arrlength);//求出原数组中和小于0的元素的和

    sum = max(sum + sum2, sum1);//sum+sum2数组两头的元素的和
    
    cout<<"最大子数组的和为:"<<sum<<endl;

    return 0;
}

 

四、结果截图

 

五、项目计划日志

周活动总结表  

姓名:李俏          日期:2016年3月19日

日期   任务听课 编写程序阅读课本准备考试  日总计

周日(3.20)

 3030    60

周一

1203030   180

周二

 3030   60

周三

 3030   60

周四

120 30   150

周五

 18030   210

周六

 6030   120

周总结

240360

210

   810

 

 

 

 

 

 

 

 

 

 

 

 

 

六、时间记录表:

学生:   李 俏                         日期 :2016年3月12日 

教师:   王建民                        课程 :软件工程      

日期

开始时间

结束时间

中断时间

净时间

活动

备注

 3.21

16:30

17:00

30

编写程序 

作业 

 

20:10

20:40

30

阅读

作业

 3.22

19:10

19:50

10

30

编写程序

作业

 

20:00

20:30 

30

阅读

 作业

 3.23

14:30

15:30

30min

30

编写程序

 作业

 

20:00

20:30 

30

阅读

 作业

3.24

18:50

19:20

30

编写程序

作业

 

20:00

20:30

30

阅读

 作业

 3.25

13:20

18:00

100 

180

编写程序

 作业

 

21:10

21:40

30

阅读

 作业

 3.26

12:00

 13:30

 30min

60

编写程序

 作业

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

七、缺陷记录日志:

学生        李俏,张莹荧    

日期       20163月25日   

教员          王建民       

程序号    2  

日期 编号类型引入阶段排除阶段修复时间修复缺陷
 3.26 1函数设计编译15min 
描述:求最大子数组的和的函数封装不恰当 。
 3.26 2结果编码编译15min 
描述:没有考虑好最大子数组结果与其他元素的结果的关系 。
 3.27 3算法编码  
描述:无法返回位置。

 

 

 

 

 

 

 

 

 

 

 

八、工作照片 

小伙伴:张莹荧(http://www.cnblogs.com/zhyying/)

 

 

转载于:https://www.cnblogs.com/Aliqiao/p/5324443.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值