JavaScript披萨促销价计算程序求助:数量≥4时逻辑实现
解决披萨促销价格计算的最优组合问题
我来帮你搞定这个披萨促销价格计算的问题!你的现有代码只处理了1-3个披萨的场景,4个及以上的最优组合逻辑确实还没实现,而且还有个小问题:输入的数量是字符串类型,直接用来做数值判断可能会出问题,我们一步步来完善它。
核心逻辑分析
首先得明确最优价格的计算规则:要尽可能优先选择单价最低的套餐,这样总价才最划算。我们先算下各套餐的单价:
- 1个:$6.45(单价$6.45)
- 2个:$12.00(单价$6.00)
- 3个:$14.00(单价≈$4.67)
显然3个的套餐单价最低,优先级最高;其次是2个套餐;最后才是单个披萨。所以计算逻辑应该是:
- 先算能买多少份3个的套餐
- 剩下的数量再判断:如果剩2个就用2个套餐,剩1个就买单个
- 不用考虑特殊调整(比如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; };
代码细节说明
- 输入处理:把输入的字符串转为整数,同时增加了非整数的验证(比如输入"3.5"会提示错误)
- 0数量处理:单独加了0的情况,避免逻辑漏洞
- 4+数量计算:用
Math.floor(qty/3)得到最多的3个套餐数,通过余数判断剩余部分的最优选择 - 价格格式化:用
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
相关产品推荐
相关产品推荐

