求数组中最大子数组的和(1000)

成员:林彦汝、张金

题目:

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

要求:

  要求程序必须能处理1000 个元素;

  每个元素是int32 类型的;

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

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

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

(我主要负责程序分析,代码编程;张金负责代码复审,代码测试计划。)

思路:

  通过第一次求一个一维数组中最大子数组的和,在此基础上我们做了扩展。前面在程序中我们固定了数组的长度,默认为5,而这次则按题目要求扩展到1000,定义数值类型为int32。让程序随机产生1000个数,用同样的方法求子数组和的最大值。

  刚看完题目时感觉不难,所以改动的地方不多,通过几次测试下来却发现了不少问题(在运行结果截图部分有分析说明)。

源代码:

#include<iostream.h>
#include<stdlib.h>
#define AMOUNT 1000

int main()
{
    long int arr[AMOUNT];
    long int arrCopy[AMOUNT];
    long int max[AMOUNT];
    int i,j;
    int n;
    int start,rear;		//子数组的开始,结束
    int mount=AMOUNT;
    for(i=0;i<mount;i++)
    {
	try
	{
            n=rand()%2;
            if(n==0)
	    {
		arr[i]=rand();
		arrCopy[i]=arr[i];
		max[i]=arr[i];
	    }
	    else
	    {
		arr[i]=-rand();
		arrCopy[i]=arr[i];
		max[i]=arr[i];
	    }
	}
	catch(long int e)
	{
	    cout<<"Long Inter=ger Exception!"<<endl;
	}
    }
    cout<<"Array :"<<endl;
    for(i=0;i<mount;i++)
    {
        cout<<arr[i]<<"  ";
	if((i+1)%10==0)
	{
	    cout<<endl;
	}
    }
    for(j=0;j<mount-1;j++)
    {
        for(i=j+1;i<mount;i++)
        {
            try
	    {
		arr[j]=arr[j]+arr[i];
		if(max[j]<arr[j])
		{
		    max[j]=arr[j];
		    rear=i+1;
		}
            }
	    catch(long int e)
	    {
		cout<<"Long Inter=ger Exception!"<<endl;
	    }
        }
    }
    for(i=0;i<mount;i++)
    {
        if(max[0]<max[i])
	{
            max[0]=max[i];
	    start=i+1;
	}
    }
    cout<<endl;
    cout<<"从第"<<start<<"个数"<<arrCopy[start-1]<<"开始"<<endl;
    cout<<"到第"<<rear<<"个数"<<arrCopy[rear-1]<<"结束"<<endl;
    cout<<"子数组和的最大值为: "<<max[0]<<endl;
    return 0;
}

运行结果:

(1)运行了几次(由于1000个数显示了100行,故只截取部分显示结果),由截图可以看到,很明显地随机产生的1000个数全部为正,没有负数。

(2)修改代码,通过随机产生0和1,来控制正数和负数的产生,避免只出现正数或者只出现负数的情况。

运行后又发现问题:因为有1000个数且数值都很大,我们并不能直接看出结果是否正确。

(3)完善程序,将子数组的位置找出来,再进行校验。

发现数值的范围还是很大,并且随机产生的数和最后相加的结果范围是不是超出了int32数据类型的范围(即是否数值越界),而C++本身在调试过程中是没有错误提示的,用异常处理来捕捉:

try

{

...

}

catch(long int e)

{

cout<<"Long Inter=ger Exception!"<<endl;

}

总结:

  之前做的数组长度我们在测试时一般都填得很小,并且给每个元素的赋值也不超过两位数,甚至是固定了,都是为了方便直接找到一个和是最大的子数组,这都不能测试出程序哪里有不足,无论是数量还是数值的大小。通过随机产生的1000个数据我们发现了问题。因为已经把时间复杂度的概念给彻底忘了,这个程序也就没有考虑。

  在调试中我的收获很大,以上截图都是调了很多次才改好了一个缺陷,因为数据很多,循环和嵌套就比较复杂,start和rear两个参数在开始添加时频繁出错,就先把数量改小,后运用单步调试到底看出错在哪一步,并且用异常处理来提示我们是否有数值越界等一些软件调试时不考虑的缺陷。

  此次结对开发没有第一次合作得好,因为觉得改动不大所以讨论得还是比较少,个人的主观看法比较多,以后还是多交流吧。

时间: 2024-10-10 13:09:07

求数组中最大子数组的和(1000)的相关文章

求二维数组中最大子数组的和

一.题目: 返回一个二维整数数组中最大子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 二:结对编程要求: 两人结对完成编程任务. 一人主要负责程序分析,代码编程. 一人负责代码复审和代码测试计划. 发表一篇博客文章讲述两人合作中的过程.体会以及如何解决冲突(附结对开发的工作照). 三:设计思路: 将二维数组的每行轮番逐次相加(包括单行)后看成一维数组,利用求

求数组中最大子数组的和(二维环)

成员:林彦汝.张金 (这次角色调换,我主要负责代码复审,代码测试计划:张金负责程序分析,代码编程.) 题目: 返回一个二维整数数组中最大子数组的和 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 思路: 在求一维环形数组和二维数组最大子数组的和的基础上,我们将两个的方法综合起来求解关于二维环形数组.假设原二维数组a[3][3]为 1 -2 3 1 -3

结对编程之求首尾相连数组中最大子数组的和

1.题目: 返回一个整数数组中最大子数组的和. 2.要求: 输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大.同时返回最大子数组的位置.求所有子数组的和的最大值.要求时间复杂度为O(n). 3.设计思想: 分情况讨论最大子数组可能出现的情况,第一种为正常情况,没有超过数组范围,第二种则比较复杂,要用到环的一部分元素,分而求出两

软件工程课程作业(四)--返回一个整数数组中最大子数组的和

伙伴链接:http://www.cnblogs.com/haoying1994/ 一.设计思想 本实验要求输入一个正负数混合的整型数组,长度不限,在此数组的所有子数组中找到和最大的数组,并求出相应数组的和,且时间复杂度为O(n).我们在课堂上共同讨论了多种解决方案,这些将在下面可能的解决方案中展示,在听了同学的思路和老师的讲解之后, 我们最终选取了老师课堂上描述的比较简便的思路.如下: 在输入数组的环节,采用for无限循环加if判断截止,直到触发回车键为止,将数组记录到Array中,数组长度记录

课后实验4--返回一个整数数组中最大子数组的和

伙伴链接:http://www.cnblogs.com/chengqiqin07/ 一.设计思想 本实验要求输入一个正负数混合的整型数组,长度不限,在此数组的所有子数组中找到和最大的数组,并求出相应数组的和,且时间复杂度为O(n).我们在课堂上共同讨论了多种解决方案,这些将在下面可能的解决方案中展示,在听了同学的思路和老师的讲解之后, 我们最终选取了老师课堂上描述的比较简便的思路.如下: 在输入数组的环节,采用for无限循环加if判断截止,直到触发回车键为止,将数组记录到Array中,数组长度记

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

题目:返回一个二维整数数组中最大子数组的和. 要求: 1 输入一个二维整形数组,数组里有正数也有负数. 2 二维数组首尾相接,象个一条首尾相接带子一样. 3 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 4 求所有子数组的和的最大值.要求时间复杂度为O(n). 设计思想 目前的解决方案是最笨的方法,穷举,所以时间复杂度达不到题目的要求,还需要进一步的寻找答案 源代码 题目:返回一个二维整数数组中最大子数组的和. 要求: 1 输入一个二维整形数组,数组里有正数也有负数. 2 二

返回一个首尾相接的二维整数数组中最大子数组的和

一.题目:返回一个二维整数数组中最大子数组的和. 二.要求: (1)输入一个二维整形数组,数组里有正数也有负数. (2)二维数组首尾相接,象个一条首尾相接带子一样. (3)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. (4)求所有子数组的和的最大值. 三.解题思路: 将两个同样的数组首尾相接合并成一个数组,在用以前求二维数组最大子数组的方法求解 四.源代码: #include<iostream> using namespace std; #include"math

二维数组中最大子数组的和

题目:返回一个二维整数数组中最大子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 思路: 借鉴网上代码整理得思路: 根据一位数组最大子数组求和的编程思路,讲二维数组转化成一维数组求解: 即求出每一行的最大子数组之和,通过比较各行最大子数组之和的大小,求出只有二维数组只有一行的情况下的最大子数组之和: 然后求每两行最大子数组之和,即将每两行的相同列相加,将二维数

整数数组中最大子数组的和有溢出如何处理

一.实验题目: 返回一个整数数组中最大子数组的和. 二.实验要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 要求程序必须能处理1000 个元素:, 每个元素是int32 类型的: 求所有子数组的和的最大值. 三.实验思路: 这次的实验是在上次的基础上改进的,初看上去需要进步的地方不大,但是 仔细想起来,确实难度不小.处理1000个元素,很容易内存溢出:然后每 个元素是int32类型的,这很容易数据溢出.这次的实验着重的要解决这个