整数拆分为几个数相加,打印所有结果

java 代码

package org.feng.num;

import java.util.*;

/**
 * Created by Feng on 2020/1/7 9:10
 * CurrentProject's name is java8
 * 将一个数分解成任意几个数之和;
 * 将所有结果输出出来;
 * 例如:4的结果有(1+3),(2+2),(1+1+2),(1+1+1+1)
 *      5的结果有(1+4),(2+3),(1+2+2),(1+1+3),(1+1+1+2),(1+1+1+1+1)
 *
 * @author Feng
 */
public class Client {
     
    public static void main(String[] args) {
     
        Client client = new Client();

        // 去掉重复的、排序
        // 若要更改排序规则,去掉排序规则的参数即可
        Set<String> set = new TreeSet<>(Comparator.reverseOrder());
        for (int[] ints : client.calculate(5)) {
     
            // 将目标数组排序
            Arrays.sort(ints);

            // 将排序后的数组转化为字符串,放入 set
            set.add(client.intsToString(ints));
        }

        // 遍历结果
        set.forEach(System.out::println);
    }


    /**
     * 思路:
     * 定义 i = 0
     * 先拆分为 i 和 num - i;循环递增 i;
     * 然后递归计算 num - 1 的拆分结果
     * 将 num 拆分为几个数相加
     * @param num 目标数;逐步递减
     */
    public Set<int[]> calculate(int num) {
     
        Set<int[]> set = new HashSet<>();
        if(num == 1){
     
            set.add(new int[]{
     1});
            return set;
        }

        if(num == 2){
     
            set.add(new int[]{
     1,1});
            return set;
        }

        // 当num既不是1,也不是2时
        for(int i = 1; i <= num / 2; i++){
     
            set.add(new int[]{
     i, num - i});

            if(i <= num - i){
     
                // 递归调用
                Set<int[]> tempSet = calculate(num - i);
                for (int[] ints : tempSet) {
     
                    ints = Arrays.copyOf(ints, ints.length + 1);
                    ints[ints.length - 1] = i;
                    set.add(ints);
                }
            }
        }
        return set;
    }

    /**
     * 将整数数组拼接为字符串
     * 
     *     [1,1,1,1,1]
     *    ==>
     *     (1+1+1+1+1)
     * 
* @param ints 目标数组 * @return 字符串 */
private String intsToString(int[] ints){ StringBuilder sb = new StringBuilder(); sb.append("(").append(ints[0]); for(int i = 1; i < ints.length; i++){ sb.append("+").append(ints[i]); } sb.append(")"); return sb.toString(); } }

结果

(2+3)
(1+4)
(1+2+2)
(1+1+3)
(1+1+1+2)
(1+1+1+1+1)

你可能感兴趣的:(java练习,java,整数拆分,求所有结果)