结对开发——数组求和大数溢出问题

一、题目要求

   返回一个整数数组中最大子数组的和。
 要求程序必须能处理1000 个元素;
   每个元素是int32 类型的;
   输入一个整形数组,数组里有正数也有负数。
 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
 求所有子数组的和的最大值。

二、程序代码

package com.java.lianxi;
import java.util.Scanner;
public class lianxi4 {
    public static void main(String[] args)
    {
        int num,i;
        long sum=0;
        long max;
        Scanner cin=new Scanner(System.in);
        System.out.print("请输入数组的长度:");
        num=cin.nextInt();
        long array[]=new long[num];
        array[0]=(long)Math.pow(2,63);
        array[1]=(long)Math.pow(2,63);
        max=array[0];
        for(i=2;i<num;i++)
        {
            if((int)(Math.random()*2)==0)
            {
                array[i]=(long)(Math.random()*100000000);
            }
            else
            {
                array[i]=-(long)(Math.random()*100000000);
            }
        }
        for(i=0;i<num;i++)
        {
             if(sum<=0)
             {
                 sum=array[i];  
             }
             else
             {
                 sum=sum+array[i];
             }
             if(sum>max)
             {
                 max=sum;
             }
        }
        if(max==(long)Math.pow(2,63))
        {
            System.out.println("大数溢出");
            System.out.print("子数组和的最大值为:"+max);
        }
        else
        {
            System.out.print("子数组和的最大值为:"+max);
        }
    }

}

三、结果截图

结对开发——数组求和大数溢出问题

四、心得体会

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

我们想了很久也没有想出来有什么解决办法,因为数据类型所能表示的数就那么大,但是如果想得到正确的结果,我们可以不输出一个最终结果,可以输出几个数相加,但是考虑到相加的几个数都要控制在2的63次方之内,很难实现。还想了一个就是可以把最后结果当成两个变量来显示,高位放在其中一个变量,低位放在另一个变量,也不知道怎么实现。

结对开发——数组求和大数溢出问题