要求:按单步执行键,在GUI看到你的程序是如何一步一步算出目前最大子数组的范围,当前计算到的临时子数组是在哪里,等等。
按自动运行键,在GUI看到程序自动运行,并自动显示过程,每次改变状态的时候要稍作停留。
思路:由n个元素组成的数组,计算子数组的最大和,从首元素开始相加,若前m(m<n)个元素和为负数,则重新从第m个元素开始相加。最后输出“和”即为子数组的和的最大值。
import java.util.Scanner; public class shuzu5 { public static void main(String []args) { Scanner input=new Scanner(System.in); int b[]=new int[5]; int k=0; System.out.println("请输入5个数的数组:"); for(int i=0;i<5;i++) { b[i]=input.nextInt(); } int t=b[0]; for(int i=0;i<5;i++) { if(b[i]<0) {k++;} } if(k==5)//判断数组中的数字是否全为负数 { for(int i=0;i<5;i++) { if(b[i]>t) { t=b[i]; } } System.out.println(t); } else { System.out.println("请选择运行方式:1:逐步运行;2:自动运行"); int a=input.nextInt(); int sum=0; int c=0; if(a==2) { for(int i=0;i<5;i++)//由n个数组成的数组,若前m(m<n)个数的和为非正数,则从第m个数重新开始相加 { System.out.println("第"+(i+1)+"步:"); if(c<0) { System.out.println("已检查了"+(i+1)+"个子数组,前"+i+"个元素和为负数,第"+(i+1)+"个元素为:"); c=b[i]; System.out.println(c); try {Thread.sleep(100);}catch(Exception e) {} } else { c+=b[i]; System.out.println("已检查了"+(i+1)+"个子数组,第1个元素到第"+(i+1)+"个元素的最大子数组和:"); System.out.println(c); try {Thread.sleep(100);}catch(Exception e) {} } if(sum<c) sum=c; } } else if(a==1) { int z=1; for(int i=0;i<5;i++)//由n个数组成的数组,若前m(m<n)个数的和为非正数,则从第m个数重新开始相加 { while(z==1) { z=0; System.out.println("第"+(i+1)+"步:"); if(c<0) { System.out.println("已检查了"+(i+1)+"个子数组,前"+i+"个元素和为负数,第"+(i+1)+"个元素为:"); c=b[i]; System.out.println(c); try {Thread.sleep(100);}catch(Exception e) {} } else { c+=b[i]; System.out.println("已检查了"+(i+1)+"个子数组,第1个元素到第"+(i+1)+"个元素的最大子数组和:"); System.out.println(c); try {Thread.sleep(100);}catch(Exception e) {} } if(sum<c) sum=c; } if(i!=4) { System.out.println("继续请摁1"); z=input.nextInt(); } } } System.out.println("最大子数组和为"+sum); } } }
结果截图: