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

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

一、程序要求

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)

  30 30        60

周一

120 30 30       180

周二

  30 30       60

周三

  30 30       60

周四

120   30       150

周五

  180 30       210

周六

  60 30       120

周总结

240 360

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/)

 

 

posted @ 2016-03-26 23:04  灯下等花开  阅读(282)  评论(1编辑  收藏  举报