现有i张十元纸币,k张五元纸币,j张两元纸币,购物后要支付n元(i,j,k,n 为整数)。要求编写一个函数Changes(i,j,k, n)

算法题:现有i张十元,k张五元,j张两元,要支付n元(i,j,k,n 为整数)。写一个函数:要求手上拥有的纸币是否足够并能刚好拼凑齐n元,而不需要找零。

直接上代码:

/*
** i: 10元的张数
** j: 5元的张数
** k: 2元的张数
** n: 支付金额
*/
  function Changes(i, j, k, n) {
            const total = i * 10 + j * 5 + k * 2 //兜里的钱
            if (total > n) { //兜里够钱
                let remaining = n //剩余的钱
                let num10 = 0; //需要十元的张数
                let num5 = 0; //需要五元的张数
                let num2 = 0; //需要两元的张数
                //计算需要十元的数量
                if (remaining >= 10 && i > 0) {
                    min10 = Math.floor(remaining / 10) //全用十元最小支付张数
                    num10 = Math.min(i, min10) //跟兜里张数对比取最小值
                    remaining = remaining - num10 * 10 //剩余应支付金额
                }
                //计算需要五元的数量
                if (remaining >= 5 && j > 0) {
                    min5 = Math.floor(remaining / 5) //剩余应付用五元最小支付张数
                    num5 = Math.min(j, min5) //跟兜里张数对比取最小值
                    remaining = remaining - num5 * 5 //剩余应支付金额
                }
                //计算需要两元的数量
                if (remaining >= 2 && k > 0) {
                    min2 = Math.floor(remaining / 2) //剩余应付用五元最小支付张数
                    num2 = Math.min(k, min2) //跟兜里张数对比取最小值
                    remaining = remaining - num2 * 2 //剩余应支付金额
                }
                //判断是否满足金额
                if (remaining === 0) {
                    console.log(`满足条件,方案为支付:${num10}张十元,${num5}张五元,${num2}张两元`)
                } else {
                    console.log(`钱够,但需找零`)
                }
            } else { //兜里钱不够
                console.log(`兜里不够钱,还差${n-total}元`)
            }
        }
        Changes(1, 1, 1, 27);

增加找零版+建议版

        function Changes(i, j, k, n) {
            const total = i * 10 + j * 5 + k * 2 //兜里的钱
            if (total > n) { //兜里够钱
                let remaining = n //剩余的钱
                let num10 = 0; //需要十元的张数
                let num5 = 0; //需要五元的张数
                let num2 = 0; //需要两元的张数
                //计算需要十元的数量
                if (remaining >= 10 && i > 0) {
                    const min10 = Math.floor(remaining / 10) //全用十元最小支付张数
                    num10 = Math.min(i, min10) //跟兜里张数对比取最小值
                    remaining -= num10 * 10 //remaining = remaining - num10 * 10 //剩余应支付金额
                }
                //计算需要五元的数量
                if (remaining >= 5 && j > 0) {
                    const min5 = Math.floor(remaining / 5) //剩余应付用五元最小支付张数
                    num5 = Math.min(j, min5) //跟兜里张数对比取最小值
                    remaining -= num5 * 5 //剩余应支付金额
                }
                //计算需要两元的数量
                if (remaining >= 2 && k > 0) {
                    const min2 = Math.floor(remaining / 2) //剩余应付用五元最小支付张数
                    num2 = Math.min(k, min2) //跟兜里张数对比取最小值
                    remaining -= num2 * 2 //剩余应支付金额
                }
                //判断是否满足金额
                if (remaining === 0) {
                    console.log(`满足条件,方案为支付:${num10}张十元,${num5}张五元,${num2}张两元`)
                } else {
                    console.log(`钱够,但需找零`)
                    // 无法凑齐所需金额,计算找零方案
                    let changeMoney = n
                    let change10 = 0;
                    let change5 = 0;
                    let change2 = 0;
                    let returnMoney = 0;
                    // 计算需要的10元纸币数量
                    if (changeMoney >= 10 && i > 0) {
                        const min10 = Math.ceil(changeMoney / 10) //全用十元最小支付张数 向上取整
                        change10 = Math.min(i, min10);
                        changeMoney -= change10 * 10;
                    }

                    // 计算需要的五元纸币数量
                    if (changeMoney >= 5 && k > 0) {
                        const min5 = Math.ceil(changeMoney / 5)
                        change5 = Math.min(k, min5);
                        changeMoney -= change5 * 5;
                    }

                    // 计算需要的两元纸币数量
                    if (changeMoney >= 2 && j > 0) {
                        const min2 = Math.ceil(changeMoney / 2)
                        change2 = Math.min(j, min2);
                        changeMoney -= change2 * 2;
                    }
                    returnMoney = Math.abs(changeMoney)
                    console.log(
                        `身上钱币没有最佳组合只有找零方案,方案是:需要${change10}张十元纸币,${change5}张五元纸币,${change2}张两元纸币,找零${returnMoney}`)
                }
            } else { //兜里钱不够
                console.log(`兜里不够钱,还差${n-total}元`)
                // 如果手上的钱不够支付
                let num10 = Math.floor(n / 10); // 计算需要的十元纸币数量
                n -= num10 * 10;
                let num5 = Math.floor(n / 5); // 计算需要的五元纸币数量
                n -= num5 * 5;
                let num2 = Math.floor(n / 2); // 计算需要的两元纸币数量
                console.log(
                    `需要${num10}张十元纸币,${num5}张五元纸币,${num2}张两元纸币,刚好可凑齐${num10 * 10 + num5 * 5 + num2 * 2}元(假设有无限张)`);
            }
        }
        Changes(4, 0, 1, 27);

猜你喜欢

转载自blog.csdn.net/CrazBarry/article/details/133354377