本文详解如何编写 calculatetables(guests, seats) 函数,根据宾客总数与每桌座位数,准确返回所需餐桌数(向下取整)和需额外安排座位的剩余宾客数(即模运算余数),并提供健壮、可读性强的实现方案。
本文详解如何编写 calculatetables(guests, seats) 函数,根据宾客总数与每桌座位数,准确返回所需餐桌数(向下取整)和需额外安排座位的剩余宾客数(即模运算余数),并提供健壮、可读性强的实现方案。
在活动策划或宴会管理场景中,合理分配餐桌资源至关重要。给定总宾客数 guests 和每张桌子的标准座位数 seats,我们需要计算:
- 最少需要多少张完整桌子(即能容纳最多整数倍宾客的桌数);
- 还有多少宾客无法被完全容纳(需加座到已有桌子,而非新增整桌)。
关键逻辑在于:
✅ 每张桌子最多坐 seats 人;
✅ 表格数量应为 Math.floor(guests / seats) —— 即“能完全坐满的桌子数”;
✅ 剩余宾客数即 guests % seats(模运算),但需注意边界情况:当 guests < seats 时,只需 1 张桌子(而非 0 张),且所有宾客都“剩余”(即全部就座于该桌,无溢出)。然而,题目示例明确要求:
- calculateTables(4, 2) → { tables: 2, remainingGuests: 0 }
- calculateTables(14, 6) → { tables: 2, remainingGuests: 2 }(因为 14 ÷ 6 = 2.33… → 取整为 2 张满桌,容纳 2×6=12 人,剩余 14−12=2 人)
- calculateTables(26, 5) → { tables: 5, remainingGuests: 1 }(26 ÷ 5 = 5.2 → 5 张满桌,容纳 25 人,剩 1 人)
这说明:tables 始终取 Math.floor(guests / seats),而 remainingGuests 就是 guests % seats —— 但必须确保 seats > 0,且当 guests === 0 时应返回 { tables: 0, remainingGuests: 0 }。
以下是优化后的专业实现(含输入校验与清晰语义):
function calculateTables(guests, seats) {
// 输入校验:非负整数,且 seats 必须大于 0
if (!Number.isInteger(guests) || !Number.isInteger(seats) ||
guests < 0 || seats <= 0) {
throw new Error('guests must be non-negative integer, seats must be positive integer');
}
// 特殊情况:无宾客
if (guests === 0) {
return { tables: 0, remainingGuests: 0 };
}
// 核心计算:满桌数 = 向下取整除法;剩余人数 = 模运算
const tables = Math.floor(guests / seats);
const remainingGuests = guests % seats;
return { tables, remainingGuests };
}✅ 验证示例:
立即学习“Java免费学习笔记(深入)”;
console.log(calculateTables(4, 2)); // { tables: 2, remainingGuests: 0 }
console.log(calculateTables(14, 6)); // { tables: 2, remainingGuests: 2 }
console.log(calculateTables(26, 5)); // { tables: 5, remainingGuests: 1 }
console.log(calculateTables(3, 10)); // { tables: 0, remainingGuests: 3 } ← 注意:3人<10座,无需整桌,但3人全需安排(题目未要求新增桌,故 remainingGuests=3 合理)⚠️ 注意事项:
- 原始问题描述中 calculateTables(14, 6) 返回 tables: 2,表明不向上取整(即不追求“全部坐下”,而是计算“已安排满座的桌数”),因此 Math.ceil() 不适用;
- remainingGuests 并非“待安排新桌的人数”,而是需加座到现有桌子的溢出人数,因此直接使用 % 运算符最简洁、高效;
- 切勿使用循环遍历(如 for(let i=0; i<guests.length...)),因 guests 是数字而非数组——这是初学者常见误区;
- 生产环境建议添加参数类型与范围校验,避免意外行为。
总结:此函数本质是整数除法的封装——tables 为商的整数部分,remainingGuests 为余数。掌握 Math.floor() 与 % 的协同使用,是处理资源分配类问题的基础能力。


















