一、题目要求
返回一个整数数组中最大子数组的和。
要求程序必须能处理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次方之内,很难实现。还想了一个就是可以把最后结果当成两个变量来显示,高位放在其中一个变量,低位放在另一个变量,也不知道怎么实现。