多重幂问题及输出每一种情况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);

    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值