编辑代码


// 加法分解

// 【问题描述】 
// 给一个正整数n,输出它所有的正整数加法的分解方法。  
// 注意:
// 1. 根据输入的要求决定交换加数的位置是否视为不同的分解方案。 
// 2. 不分解也视为一种分解方案。  
// 3. 按字典序输出所有分解方案,格式见样例。

// 【输入格式】
// 输入共1行,包含2个正整数n和m,之间用一个空格隔开。
// n表示待分解正整数,
// m是1或者2:
// 1表示交换加数的位置视为不同的分解方案
// 2表示交换加数的位置视为相同的分解方案。


function findSum(target, type) {
    let res = []
    const path = []

    backtracking(target)

    function backtracking(cur) {
        // 递归的结束条件
        if (cur === 0) {
            res.push([...path]) // 解除引用,存放结果
            return;
        }

        for (let i = 1; i <= cur; i++) {
            path.push(i)
            backtracking(cur - i); // 下一层递归的结束位置
            path.pop()
        }
    }

    if (type === 2) {
        const set = new Set()
        for (let i in res) {
            set.add(res[i].sort((a, b) => a - b).join('+'))
        }
        return Array.from(set)
    } else {
        for (let i in res) {
            res[i] = res[i].join('+')
        }
    }

    return res
}
function myPrint(arr) {
    for (let i in arr) {
        console.log(`5=${arr[i]}`)
    }
}
myPrint(findSum(5, 1))
console.log("-------------------")
myPrint(findSum(5, 2))