zoukankan      html  css  js  c++  java
  • 结对项目——可循环的最大子数组

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

    一、程序要求

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

  • 相关阅读:
    有关 JavaScript 的 10 件让人费解的事情
    Apache ab介绍1
    Oracle Raw,number,varchar2... 转换
    Flex开发者需要知道的10件事
    linux命令之nice
    JavaIO复习和目录文件的复制
    使用php获取网页内容
    linux 安装sysstat使用iostat、mpstat、sar、sa
    SQL Injection 实战某基金
    ubuntu root锁屏工具
  • 原文地址:https://www.cnblogs.com/Aliqiao/p/5324443.html
Copyright © 2011-2022 走看看