软件工程结对开发——一维最大子数组求和溢出问题

一、题目要求

  题目:返回一个整数数组中最大子数组的和。
  要求:
    要求程序必须能处理1000 个元素;
    每个元素是int32 类型的;
    输入一个整形数组,数组里有正数也有负数。
    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
    求所有子数组的和的最大值。要求时间复杂度为O(n)。

二、设计思路

  将数组第一个和第二个数置为2的63次方,观察结果是否溢出。

三、源代码

 1 package com.java.lianxi;
 2
 3 import java.util.Scanner;
 4
 5 public class lianxi4 {
 6     public static void main(String[] args)
 7     {
 8         int num,i;
 9         long sum=0;
10         long max;
11         Scanner cin=new Scanner(System.in);
12         System.out.print("请输入数组的长度:");
13         num=cin.nextInt();
14         long array[]=new long[num];
15         array[0]=(long)Math.pow(2,63);
16         array[1]=(long)Math.pow(2,63);
17         max=array[0];
18         for(i=2;i<num;i++)
19         {
20             if((int)(Math.random()*2)==0)
21             {
22                 array[i]=(long)(Math.random()*100000000);
23             }
24             else
25             {
26                 array[i]=-(long)(Math.random()*100000000);
27             }
28         }
29         for(i=0;i<num;i++)
30         {
31              if(sum<=0)
32              {
33                  sum=array[i];
34              }
35              else
36              {
37                  sum=sum+array[i];
38              }
39              if(sum>max)
40              {
41                  max=sum;
42              }
43         }
44         if(max==(long)Math.pow(2,63))
45         {
46             System.out.println("大数溢出");
47             System.out.print("子数组和的最大值为:"+max);
48         }
49         else
50         {
51             System.out.print("子数组和的最大值为:"+max);
52         }
53     }
54
55 }

四、运行结果截图

五、心得体会

  通过测试,发现当溢出时,最大子数组的和恒为2的63次,也就是long型所能表示的最大整数,出现大数溢出,所得的不是我们想要的结果。

我们想了很久也没有想出来有什么解决办法,因为数据类型所能表示的数就那么大,但是如果想得到正确的结果,我们可以不输出一个最终结果,可以输出几个数相加,

但是考虑到相加的几个数都要控制在2的63次方之内。

还想了一个就是可以把最后结果当成两个变量来显示,高位放在其中一个变量,低位放在另一个变量,但是我们都没有实现。

时间: 2024-08-21 05:40:16

软件工程结对开发——一维最大子数组求和溢出问题的相关文章

软件工程结对开发之求一个数组中连续最大子数组之和

一.团队成员: 檀威,陈志利 二.项目名: 求一个数组中连续最大子数组之和 三.我们的设计思路: 设sum[i]为以第i个元素结尾且和最大的连续子数组.对于元素i,所有以它前面的元素结尾的子数组的长度都已经求得,那么以第i个元素结尾且它们之和最大的连续子数组要么是以第i-1个元素结尾且它们之和最大的连续子数组加上这个元素,要么是只包含第i个元素,即sum[i] = max(sum[i-1] + arr[i], arr[i]).可以通过判断sum[i-1] + arr[i]是否大于arr[i]来做

软件工程结对开发——返回一个整数数组中最大子数组的和(JAVA)

题目:返回一个整数数组中最大子数组的和. 要求: 输入一个整型数组,数组里有正数也有负数: 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和: 求所有子数组的和的最大值.要求时间复杂度为O(n): 一.设计思想 1.首先随机产生一个数组,数组长度可自行输入,该数组里有正数也有负数. 2.从数组中第一个元素a[0]开始,依次计算a[0].a[0]+a[1].a[0]+a[1]+...+a[i]的值,即从a[0]开始的每个子数组的和,取出最大值. 3.再从数组第二个元素a[1]开始,依

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

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

结对开发五--最大子数组的和(大数溢出)

一.设计思路 根据上一个实验,再让他自动生成1000个随机long型数.并且自己埋入炸弹,看是否有异常出错. 二.实验代码 1 import java.util.*; 2 class SuperMax3 3 { 4 public static void main(String[] args) 5 { 6 long[] list = new long[1000];//输入数组是必须先定义数组,否则出错! 7 long[] arr1 = new long[1000];//输入数组是必须先定义数组,否

结对开发Ⅳ——一维数组求和最大的子数组(大数溢出)

一.设计思路 由于我们第一个版本的算法不太好,导致后来拓展的两个程序无法很好地实现,我们就又重新设计了一个.我们是先写的首尾相连的那个程序,在它的基础上稍微修改了一下. (1)数据结构是链表,存放数据和next指针: (2)生成特别大的随机数,数据也设置得比较多. 二.源代码 未调试好 1 // 一维最大子数组2.cpp : Defines the entry point for the console application. 2 // 袁佩佩 于海洋 3 4 #include "stdafx

3、软件工程结对开发之求一维数组中连续最大子数组之和并判断溢出

一.题目要求 题目:返回一个整数数组中最大子数组的和. 要求: 要求程序必须能处理1000 个元素: 每个元素是int32 类型的: 输入一个整形数组,数组里有正数也有负数: 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和: 求所有子数组的和的最大值.要求时间复杂度为O(n): 结果溢出之后能判断. 二.设计思想 在我们的前一个程序中,由于int类型rand()随机产生数范围是0~32767,所以产生的1000个数较小,不会产生溢出.但我们通过查资料得知int32最大数是2147

软件工程结对开发之求一维数组中连续最大子数组之和2

一.题目要求 题目:返回一个整数数组中最大子数组的和. 要求: 要求程序必须能处理1000 个元素: 每个元素是int32 类型的: 输入一个整形数组,数组里有正数也有负数: 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和: 求所有子数组的和的最大值.要求时间复杂度为O(n): 结果溢出之后能判断. 二.设计思想 在求最大连续子数组时同样用动态法,对于新增的要求,可以增大随机产生数的倍数,如果结果溢出则输出溢出提示字样,其中int类型rand()随机产生数范围是0~32767,i

5、软件工程结对开发之求一维数组中连续最大子数组之和

一.题目:返回一个二维整数数组中最大子数组的和.二.要求:输入一个二维整形数组,数组里有正数也有负数.二维数组首尾相接,象个一条首尾相接带子一样.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n). 三.设计思想 这个实验是在前几次实验的基础上,利用动态数组,为了满足首尾相连,所以在计算一次之后,要把该数放在数组的最后边,这样循环遍历最后求出最大子数组的和. 四.源代码 1 #include <iostream.h> 2 int

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

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