多重幂问题及输出每一种情况java

一、问题描述

1.设给定n个变量x1,x2,…,xn。将这些变量依序作底和各层幂,可得n重幂如下
2.这里将上述n重幂看作是不确定的,当在其中加入适当的括号后,才能成为一个确定的n重幂。不同的加括号方式导致不同的n重幂。例如,当n=4时,全部4重幂有5个。
3.对n个变量计算出有多少个不同的n重幂。
4.输出n重幂的每种情况

二、问题分析及算法分析

1,利用分治的思想将原问题看成一个序列问题,序列顺序不变给序列加入适当的括号确定一个n重幂。
2,按分治的思想将原问题分解为原子问题,即先求一重幂。
3,通过a[i]=”(”+a[j]+a[i-j]+”)”的形式求第n重幂的情况,a[j]和a[i-j]是集合里面存着第j或i-j重幂的n种情况。
遍历a[n]输出n重幂的所有情况,a[n].size()即n重幂的情况数目。

代码

import java.util.ArrayList;

/**
 * 描述 多重冪
 * @author THTF
 * @date 2018年7月9日
 */

public class MultiplePower {

    private static StrList[] l; //下标表示第n重幂,  .str是ArrayList数组用来存第n重幂的所有形式

    public MultiplePower(int n) {
        l = new StrList[n + 1];     //初始化
        for (int i = 0; i < n + 1; i++) {
            l[i] = new StrList();   //初始化
        }
        l[0].str.add(null); //0号下标不用
        l[1].str.add("*");      //1重幂的时候不加括号
        for (int i = 2; i <= n; i++) {
            for (int j = 1; j < i; j++) {
                for (String str2 : l[j].str) {
                    for (String str3 : l[i - j].str) {
                        l[i].str.add("(" + str2 + str3 + ")");
                    }
                }
            }
        }
        show(n);
    }


    /**
     * 描述 输出所有n重幂
     * @param n
     */
    public static void show(int n) {
        for (String i : l[n].str) {
            StringBuilder sb = new StringBuilder(i);
            int counter = 0;
            for (int k = 0; k < i.length(); k++) {
                if (sb.charAt(k) == '*') {
                    sb.setCharAt(k, (char) ('A' + counter++));
                }
            }
            System.out.println(sb);
            System.out.println("共"+l[n].str.size()+"种");
        }
    }
}


/**
 * 
 * @author THTF
 * @date 2018年7月9日
 */
class StrList {

    public ArrayList<String> str;

    public StrList() {
        str = new ArrayList<String>(10000);

    }
}

猜你喜欢

转载自blog.csdn.net/qq_41706670/article/details/81196874