一维数组计算最大子数组并且能进行步骤可视化

程序思路:

首先实现求一维数组的最大子数组,然后实现打印输出计算步骤,在通过数组存储每一次打印输出的结果(包括最大值,最大子数组的首尾值),通过用户的要求回看步骤按要求输出输出数组的值。

代码:

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]+"个值");
                 }
             }
         }
    }

源程序结果截图:

 

posted @ 2019-04-25 20:14  zhoulonghai  阅读(237)  评论(0编辑  收藏  举报