zoukankan      html  css  js  c++  java
  • 一维数组计算最大子数组并且能进行步骤可视化

    程序思路:

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

    代码:

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

    源程序结果截图:

  • 相关阅读:
    HDU 2509 nim博弈
    HDU 1907 nim博弈变形
    HDU 1568 double 快速幂
    HDU 5950 矩阵快速幂
    HDU 1796 容斥原理
    Linux raid信息 查看
    Linux Ubuntu 内核升级
    Ubuntu 14.04 为 root 帐号开启 SSH 登录
    Google 分布式关系型数据库 F1
    分布式事务实现-Spanner
  • 原文地址:https://www.cnblogs.com/zhoulonghai/p/10770680.html
Copyright © 2011-2022 走看看