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

一、题目要求

  题目:返回一个整数数组中最大子数组的和。
  要求:
    要求程序必须能处理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次方之内。

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

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