实验要求:
要求程序必须能处理1000个元素
每个元素是int32类型的,出现子数组之和大于整形表示的最大范围会出现什么情况
代码:
1 package 子数组更改; 2 3 import java.util.Scanner; 4 5 public class zsz { 6 7 /** 8 * @param args 9 */ 10 public static void main(String[] args) { 11 // TODO Auto-generated method stub 12 13 Scanner A=new Scanner(System.in); 14 System.out.println("请输入数组长度:"); 15 int n=A.nextInt(); 16 17 System.out.println("请输入数组数值范围:"); 18 int N=A.nextInt(); 19 int M=A.nextInt(); 20 int a[]=new int[n]; 21 int b[][]=new int[n][n]; 22 23 int i; 24 System.out.println("数组为:"); 25 for(i=0;i<n;i++) 26 { 27 a[i]=N+(int)(Math.random()*(M-N)); 28 System.out.print(a[i]+" "); 29 } 30 System.out.println(); 31 32 int j,k=n,t; 33 for(i=0;i<n;i++) 34 { 35 for(j=0;j<k;j++) 36 { 37 for(t=j;t<j+i+1;t++) 38 { 39 b[i][j]+=a[t]; 40 } 41 } 42 k--; 43 } 44 45 System.out.println("各子数组大小:"); 46 for(i=0;i<n;i++){ 47 for(j=0;j<n;j++){ 48 System.out.print(b[i][j]+" "); 49 } 50 System.out.println(); 51 } 52 53 int p=b[0][0]; 54 int q=0,r=0; 55 for(i=0;i<n;i++) 56 { 57 for(j=0;j<n-i;j++) 58 { 59 if(p<b[i][j]) 60 { 61 p=b[i][j]; 62 q=i; 63 r=j; 64 } 65 } 66 } 67 System.out.println(" 本数组中子数组和最大的为:"+p); 68 System.out.println("这个子数组是:"); 69 for(i=0;i<q+1;i++) 70 { 71 System.out.print(a[r+i]+" "); 72 } 73 74 } 75 76 }
测试思路:
固定取值范围为-1000~1000,分别测试100、200、500、1000个数据,再测试100个数据下,取值范围为99999999—999999999和999999999—9999999999的结果
测试结果:
100个数据:
200个数据:
500个数据:
1000个数据:
99999999—999999999
999999999—9999999999
出现的问题:
当测试值的取值范围为9个9到10个9之间时无法输出结果。
可能的解决方案:
无法输出,肯定就是数值过大超过了定义结果的数据类型所能承载的数值范围。此程序中将所有数组均定义为int,int为32位有符号整数,范围为-231~231-1。
解决的方法就好应该是在设计程序时就考虑好值的取值范围,让产生的值不超过定义数据类型的取值范围。过大的话我的目前想法的就是建立一个远超过产生值的取值范围的一维数组,再逐位从后向前赋在一维数组中,在对这个一维数组进行操作。搜索了很多,查到了一个bigdecimal 类型,用它来精确运算和大数的运算,可将int,float,double,long,和BigDecimal对象相互转换。
总结:
对于数据的测试要考虑全面,避免测试数据单调重复。
成员:
刘双渤,刘洪阳
成员照: