结对开发——循环数组的最大值

题目要求:

  

  返回一维数组中最大子数组的和

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

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

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

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

  求所有子数组的和的最大值。

  要求时间复杂度为O(n)

设计思路:(结对思考以及参考于其他同学)

  考虑到数组需要首尾相连,采取把数组的长度增加两倍,并把复制的数组写在在最后一个数的后面,这样在循环的过程中并不需要采用新的算法,只要把原来的代码稍微修改一下,加一个判断使得组成最大数组的长度不超过原数组的长度即可。

三,代码

#include <iostream.h>
#include <stdlib.h>
int main()
{
    int num,length,start,finish;
    start=0;
    finish=0;
    cout<<"请输入数组元素个数:";
    cin>>length;
    num=2*length;       //分配2倍数组空间,方便下次比较
    int* Array=new int[num];     //分配数组空间 

    for(int i=0;i<length;i++)    //数组正负交替出现
    {
        if(i%2==0)
            Array[i]=rand()%1000;
        else
            Array[i]=0-(rand()%1000);
    }
    cout<<"数组为:";
    for(i=0;i<length;i++)
    {
        cout<<Array[i]<<" ";
    }
    cout<<endl; 

    //以下代码参考与其他同学以及度娘
    int max=Array[0];
    int sum=0;      //定义求和变量
    for(i=0;i<length;i++)
    {
       sum=0;
       for(int j=i;j<length+i;j++)
       {
           sum=sum+Array[j];
           if(sum>max)
           {
               max=sum;
               start=i;
               finish=j;
           }
       }
       Array[length+i]=Array[i];  //每次将已经计算过的数放到最后
    }
    if(finish>=length)
    {
        cout<<"最大子数组起始位置为:"<<start+1<<endl;
        cout<<"最大子数组终止位置为:"<<finish-length+1<<endl;
    }
    else
    {
        cout<<"最大子数组起始位置为:"<<start+1<<endl;
        cout<<"最大子数组终止位置为:"<<finish+1<<endl;
    }
    cout<<"最大子数组为:"<<endl;
    for(int m=start;m<=finish;m++)
    {
        cout<<Array[m]<<" ";
    }
    cout<<endl;
    cout<<"最大子数组的和为:"<<endl;
    cout<<max<<endl; 

    delete []Array;
    return 0;
} 

四,实验截图

五,结对开发体会

本次实验明显队友比我付出的多,但是这也体现了结对开发的魅力所在,并不是说每个人付出的必须等价,让每个人处于尽可能自由的状态有时候会事半功倍。

时间: 2024-08-03 08:26:02

结对开发——循环数组的最大值的相关文章

结对开发--循环一维数组求最大子数组的和

结对人员:韩雪东,高扬 一.设计思路 这次编程我们主要是以以前的程序为基础,在此基础上通过改变数组元素的位置,形成新的数组,并通过调用我们之前找最大值的函数,找出每个数组的最大值,然后经过比较求得结果. 二.源代码 // shuzuhuan0327.cpp : Defines the entry point for the console application. //作者:韩雪东,高扬 //时间:2015/3/27 #include "stdafx.h" #include "

结对开发Ⅵ——循环二维数组求和最大的子数组

一.题目及要求 题目:返回一个二维整数数组中最大子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数.    二维数组首尾相接,象个一条首尾相接带子一样.     数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.  求所有子数组的和的最大值.要求时间复杂度为O(n). 二.设计思路 (1)二维数组我们采用的还是数组的形式: (2)读取nxm的二维数组,储存成nx2m,把前m列重复加在二维数组的最后: (3)搜索最大数组的方法和不循环的二维数组是一样的,就是再加上判断条

软件工程课堂训练——结对开发之环数组最大和

一.题目及要求: 题目:返回一个整数数组中最大子数组的和 要求(新加):①如果数组A[0]...A[j-1]首尾相邻,允许A[i-1]...A[n-1],A[0]...A[j-1]之和最大:②同时返回最大子数组的位置. 结对人员:胡亚宝  焦燕 二.设计思路: 我们要解决两个问题:求出环数组中最大的子数组:并且定位出该子数组的位置,把它们的名称输出来.要解决这两个问题,我们从以下两个方面入手: ①求出最大子数组:将数组数值按顺序排好称为“一趟”,每求出一趟的最大子数组后,将第一个数值放到最后一个

结对开发——一维数组最大子数组判断溢出

一 题目 求一维数组最大子数组和 要求:1000个数以上,整数 二.设计思路 最大子数组很好找到,但是子数组和的溢出问题很难解决. 经过不断的思考,我得出了结论: 溢出是程程序设计者设计时的不足所带来的错误.所以设计者要在编码时便高度警惕,预防溢出的发生,这才是最本质的解决问题的方法.就本题而言,我们设置了元素最大个数,以及其它输入要求,尽量避免溢出的发生.1000个数相加可以实现,但非要取1000个最大的数相加,那样的计算没有意义,不会在我们的生活学习中出现,这属于科研问题,交给大神们来解决吧

结对开发 首尾相连数组

一.实验思路   按要求随机产生几个数,然后先求数组的最大子数组的最大值,然后再比较他们的最大值求出整个子数组的最大子数组和 付东:程序编码和思路讨论                    岳竞一:思路讨论,代码编程后的测试和审核 二.实验代码 #include<iostream.h> #include<stdlib.h> int Maxsum(int *a,int n)//一维数组的求最大 { int tempstart =0,sum=0,max=-1000;  int i; i

结对开发_循环数组的最大值

题目要求: 返回一维数组中最大子数组的和 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值. 要求时间复杂度为O(n) 设计思路:(结对思考以及参考于其他同学) 考虑到数组需要首尾相连,采取把数组的长度增加两倍,并把复制的数组写在在最后一个数的后面,这样在循环的过程中

结对开发Ⅴ——循环一维数组求和最大的子数组

一.设计思路 (1)数据的存储结构是链表,最后一个结点的next指向第一个元素的结点: (2)数据个数为n,则最多有n*(n+(n-1)+...+1)种情况(包括重复): (3)剩下的部分与二维数组的差不多. 二.源代码 1 // 一维数组.cpp : Defines the entry point for the console application. 2 // 袁佩佩 于海洋 3 4 #include "stdafx.h" 5 #include<iostream.h>

结对开发-- 一维数组求和最大的子数组的大数溢出问题

结对人员:韩雪东,高扬 一.设计思路 对于大数溢出问题开始很迷茫,不大懂该干什么,思路匮乏.因为只要溢出这个数就不会被存储被改变,这样导致很难去判断溢出后该怎样做,但后来我们改变了一下思路,采用逆向思维,首先找到能存储的最大数,用它来减去将要运行的数,从而与即将要加的数比较,如果小了咋说明相加后会产生溢出,直接结束程序. 二.源代码 // ceshi.cpp : Defines the entry point for the console application. //作者:韩雪东,高扬 //

结对开发~环形数组篇

实验题目 题目:返回一个整数数组中最大子数组的和. 要求:      输入一个整形数组,数组里有整数也有负数.      数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.      如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],……A[n-1],A[0]……A[j-1]之和最大.      同时返回最大子数组的位置. 求所有子数组的和的最大值.要求时间复杂度为O(n). 实验思路 由于这次所要求的子数组相当于一个环形的数组,所以就想到了类似数字右循环的形式来解决这个