实验要求:
要求程序必须能处理1000个元素
每个元素是int32类型的,出现子数组之和大于整形表示的最大范围会出现什么情况
设计思路:
首先进行数组的溢出处理,从小向大开始验证,直到程序处理时间较长。
然后进行程序所支持的最大整数测试,因为结果或过程中所出现的最大数是无法预测的,所以只需确定最大的随机数范围。
测试结果:
100个数据:
200个数据:
500个数据:
1000个数据:
99999999—999999999
999999999—9999999999
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]+"\t");
}
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]+"\t");
}
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("\n本数组中子数组和最大的为:"+p);
System.out.println("这个子数组是:");
for(i=0;i<q+1;i++)
{
System.out.print(a[r+i]+"\t");
}
}
}
结果分析:
处理最大数据问题:因为时间复杂度较高,所以在处理到500个数组长度的时候时间就超过10秒,1000个数据同样能处理,但因为数据太多,所以只能显示结果部分,前些部分不能在控制台显示出来。
能处理得最大数:最大到99999999—999999999还可以处理,如果数组范围在999999999—9999999999便出现错误信息,
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)
结组实现:
代码部分:刘洪阳;测试部分:刘双渤。