整数子数组求最大和添加验证

实验要求:

要求程序必须能处理1000个元素

每个元素是int32类型的,出现子数组之和大于整形表示的最大范围会出现什么情况

设计思路:

首先进行数组的溢出处理,从小向大开始验证,直到程序处理时间较长。

然后进行程序所支持的最大整数测试,因为结果或过程中所出现的最大数是无法预测的,所以只需确定最大的随机数范围。

测试结果:

100个数据:

 

200个数据:

 

500个数据:

 

1000个数据:

 

99999999999999999

 

 

9999999999999999999

 

package 子数组更改;

import java.util.Scanner;

public class zsz {

/**

 * @param args

 */

public static void main(String[] args) {

// TODO Auto-generated method stub

Scanner A=new Scanner(System.in);

System.out.println("请输入数组长度:");

int n=A.nextInt();

System.out.println("请输入数组数值范围:");

int N=A.nextInt();

int M=A.nextInt();

int a[]=new int[n];

int b[][]=new int[n][n];

int i;

System.out.println("数组为:");

for(i=0;i<n;i++)

{

a[i]=N+(int)(Math.random()*(M-N));

System.out.print(a[i]+" ");

}

System.out.println();

int j,k=n,t;

for(i=0;i<n;i++)

{

for(j=0;j<k;j++)

{

for(t=j;t<j+i+1;t++)

{

b[i][j]+=a[t];

}

}

k--;

}

System.out.println("各子数组大小:");

for(i=0;i<n;i++){

for(j=0;j<n;j++){

System.out.print(b[i][j]+" ");

}

System.out.println();

}

int p=b[0][0];

int q=0,r=0;

for(i=0;i<n;i++)

{

for(j=0;j<n-i;j++)

{

if(p<b[i][j])

{

p=b[i][j];

q=i;

r=j;

}

}

}

System.out.println(" 本数组中子数组和最大的为:"+p);

System.out.println("这个子数组是:");

for(i=0;i<q+1;i++)

{

System.out.print(a[r+i]+" ");

}

}

}

结果分析:

处理最大数据问题:因为时间复杂度较高,所以在处理到500个数组长度的时候时间就超过10秒,1000个数据同样能处理,但因为数据太多,所以只能显示结果部分,前些部分不能在控制台显示出来。

能处理得最大数:最大到99999999999999999还可以处理,如果数组范围在9999999999999999999便出现错误信息,

Exception in thread "main" java.util.InputMismatchException: For input string: "9999999999"

at java.util.Scanner.nextInt(Unknown Source)

at java.util.Scanner.nextInt(Unknown Source)

at 子数组更改.zsz.main(zsz.java:19)

结组实现:

代码部分:刘洪阳;测试部分:刘双渤。

 

原文地址:https://www.cnblogs.com/luffyyang/p/4387691.html