一维数组计算最大子数组并且能进行步骤可视化
程序思路:
首先实现求一维数组的最大子数组,然后实现打印输出计算步骤,在通过数组存储每一次打印输出的结果(包括最大值,最大子数组的首尾值),通过用户的要求回看步骤按要求输出输出数组的值。
代码:
package display; import java.util.Random; import java.util.Scanner; public class printout { public static void main(String[] args) { Scanner sc = new Scanner(System.in); Random random=new Random(); System.out.print("输入数组的大小:");//获取用户要求的数组大小 int p = sc.nextInt(); int a[] = new int[p];//定义用户要求的数组大小 System.out.print("输入数组内容("+p+"个):"); for(int i = 0 ; i < p ; i++)//获取数组的值 { a[i] = sc.nextInt(); } System.out.print("\n"); int sumshuzu = 0;//计算需检测的子数组的个数 for(int i = 1; i <= p ;i++) { sumshuzu = sumshuzu + i; } int Max = a[0];//最大值 int sumcha = 0;//记录已经检测的子数组的个数 int n = 1 ; int Maxx = 1;//记录最大子数组的和的数组头的值 int Maxy = 1;//记录最大子数组的和的数组尾的值 int intMax[] = new int[sumshuzu]; int intMaxx[] = new int[sumshuzu]; int intMaxy[] = new int[sumshuzu]; for(int m = 0 ; m < p ; m++)//计算子数组 { int sum = a[m];//和 sumcha = sumcha +1; System.out.println("共需检验"+sumshuzu+"个;"+"已检验"+sumcha+"个子数组"); System.out.println("最大值是:"+Max); intMax[sumcha-1] = Max; if(Max > sum)//如果子数组和小于最大值,则最大子数组不变,即Maxx和Maxy的值不变 { System.out.println("最大子数组值是从第"+Maxx+"个值加到第" +Maxy+"个值"); intMaxx[sumcha-1] = Maxx; intMaxy[sumcha-1] = Maxy; } if(Max < sum) //如果子数组和大于最大值,则最大子数组现在为一个数,即Maxx和Maxy的值相同 { Max = sum; Maxx = m + 1; Maxy = m + 1; System.out.println("最大子数组值是从第"+Maxx+"个值加到第" +Maxy+"个值"); intMaxx[sumcha-1] = Maxx; intMaxy[sumcha-1] = Maxy; } for(n = m + 1;n < p ;n++ ) { if(Max < a[n]) Max = a[n]; sum = sum + a[n]; sumcha = sumcha +1; System.out.println("共需检验"+sumshuzu+"个;"+"已检验"+sumcha+"个子数组"); System.out.println("最大子数组值是:"+Max); intMax[sumcha-1] = Max; if(Max > sum)//如果子数组和小于最大值,则最大子数组不变,即Maxx和Maxy的值不变 { System.out.println("最大子数组值是从第"+Maxx+"个值加到第" +Maxy+"个值"); intMaxx[sumcha-1] = Maxx; intMaxy[sumcha-1] = Maxy; } if(Max < sum) //如果子数组和大于最大值,则最大子数组变化,即Maxx和Maxy的值变为此时计算的子数组的首和尾 { Max = sum; Maxx = m + 1; Maxy = n + 1; System.out.println("最大子数组值是从第"+Maxx+"个值加到第" +Maxy+"个值"); intMaxx[sumcha-1] = Maxx; intMaxy[sumcha-1] = Maxy; } } } System.out.println(" "); System.out.println("数组最大子数组值是:"+Max); int k = 0; System.out.print("请输入是否回看步骤(回看回复1,不会看回复0):"); k = sc.nextInt(); if( k == 1) { //回看计算步骤 System.out.print("请输入要从第几步回看:"); int huikan; huikan = sc.nextInt(); System.out.println(" "); for(int i = huikan ;i < sumshuzu+1;i++) { System.out.println("共需检验"+sumshuzu+"个;"+"已检验"+i+"个子数组"); System.out.println("最大值是:"+intMax[i-1]); System.out.println("最大子数组值是从第"+intMaxx[i-1]+"个值加到第" +intMaxy[i-1]+"个值"); } } } }
源程序结果截图: