You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript披萨促销价计算程序求助:数量≥4时逻辑实现

解决披萨促销价格计算的最优组合问题

我来帮你搞定这个披萨促销价格计算的问题!你的现有代码只处理了1-3个披萨的场景,4个及以上的最优组合逻辑确实还没实现,而且还有个小问题:输入的数量是字符串类型,直接用来做数值判断可能会出问题,我们一步步来完善它。

核心逻辑分析

首先得明确最优价格的计算规则:要尽可能优先选择单价最低的套餐,这样总价才最划算。我们先算下各套餐的单价:

  • 1个:$6.45(单价$6.45)
  • 2个:$12.00(单价$6.00)
  • 3个:$14.00(单价≈$4.67)

显然3个的套餐单价最低,优先级最高;其次是2个套餐;最后才是单个披萨。所以计算逻辑应该是:

  1. 先算能买多少份3个的套餐
  2. 剩下的数量再判断:如果剩2个就用2个套餐,剩1个就买单个
  3. 不用考虑特殊调整(比如4个用2+2),因为3+1的组合总价$20.45比2+2的$24更划算

完善后的代码

let calcOrder = () => { 
    // 获取输入并转为整数(购买数量应为整数)
    var qtyInput = document.getElementById("quantity").value;
    var qty = parseInt(qtyInput);
    const price1 = 6.45;
    const price2 = 12.0;
    const price3 = 14.0;
    let totalPrice;
    const messageEl = document.getElementById("message");

    // 输入验证
    if (qtyInput === "") {
        messageEl.innerHTML = "Missing input";
    } else if (isNaN(qty) || !Number.isInteger(qty)) {
        messageEl.innerHTML = "Please enter a valid whole number";
    } else if (qty < 0) {
        messageEl.innerHTML = "Negative numbers are not allowed";
    } else if (qty === 0) {
        messageEl.innerHTML = "Total price is $0.00";
    } else {
        // 计算最优总价
        if (qty === 1) {
            totalPrice = price1;
        } else if (qty === 2) {
            totalPrice = price2;
        } else if (qty === 3) {
            totalPrice = price3;
        } else {
            // 处理4个及以上的情况
            const count3 = Math.floor(qty / 3); // 最多能买的3个套餐数量
            const remainder = qty % 3; // 剩余数量

            switch(remainder) {
                case 0:
                    totalPrice = count3 * price3;
                    break;
                case 1:
                    // 3个套餐+1个,比拆成2个2个套餐更划算
                    totalPrice = count3 * price3 + price1;
                    break;
                case 2:
                    // 3个套餐+2个套餐
                    totalPrice = count3 * price3 + price2;
                    break;
            }
        }
        // 格式化输出价格(保留两位小数)
        messageEl.innerHTML = `Total price is $${totalPrice.toFixed(2)}`;
    }

    // 阻止表单提交
    return false;
};

代码细节说明

  1. 输入处理:把输入的字符串转为整数,同时增加了非整数的验证(比如输入"3.5"会提示错误)
  2. 0数量处理:单独加了0的情况,避免逻辑漏洞
  3. 4+数量计算:用Math.floor(qty/3)得到最多的3个套餐数,通过余数判断剩余部分的最优选择
  4. 价格格式化:用toFixed(2)确保输出的价格是两位小数,符合货币格式

测试案例验证

  • 4个:3+1 → $14 + $6.45 = $20.45
  • 5个:3+2 → $14 + $12 = $26.00
  • 7个:3*2+1 → $28 + $6.45 = $34.45
  • 8个:3*2+2 → $28 + $12 = $40.00
  • 9个:3*3 → $42.00

这些结果都完全符合最优价格规则。

内容的提问来源于stack exchange,提问作者Otto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 11:22:59