{ }codelper
参数P0257

带默认值的箱子数函数

编写函数 箱数(物品, 每箱, 空位),返回把物品分装进箱子所需的箱子数。
每个箱子有 每箱 个格子,为了防止破损,每个箱子留出 空位 个格子不放东西。
所以一个箱子最多装 (每箱 − 空位) 个物品。
所需箱子数是能装下全部物品的最少箱子数。
物品为 0 个时是 0。
没有给出 每箱 时按 12 算,没有给出 空位 时按 0 算。
不会只给 空位 而省略 每箱。
第一行给出询问数 q,接下来 q 行每行给出 1~3 个整数,用空格分开。
这些数依次是 物品、每箱、空位。
所以有两个数时,第二个是 每箱。
对每个询问输出一行箱子数。
试着用带默认值的参数来解(没有这种语法的语言用多个同名函数,或在调用处补上)。

输入
1 ≤ q ≤ 1,000。
0 ≤ 物品 ≤ 1,000,000,000,1 ≤ 每箱 ≤ 1,000,0 ≤ 空位 < 每箱(均为整数)
输出
q 行,每个询问的箱子数
样例 1 · stdin
5
30
30 10
30 10 4
0 7 3
24
stdout
3
3
5
0
2
main.py
输入(stdin)

运行时这些行会依次作为 input()/标准输入传入(运行中不会等待输入)。

$ 就绪

请在电脑上打开以编写和运行代码。在手机上可以查看题目和题解。

其他语言怎么写?查看各语言题解 · 8 种语言题解

默认值的写法因语言而异。
Python def boxes(items, size=12, gap=0)、JS/TS function boxes(items, size = 12, gap = 0)、C# static long Boxes(long items, int size = 12, int gap = 0)、C++ long long boxes(long long items, int size = 12, int gap = 0) 都在参数后面加 = 值,带默认值的参数放在后面。
Java 没有默认值,所以另写 boxes(items) 和 boxes(items, size)(重载),让它们调用参数多的那个;C 和 Craykon 既没有默认值也没有重载,由调用方用 12 和 0 补上缺的值,把三个都传进去(Craykon 箱数(items, size, gap))。
实参按从前往后的顺序填入。
所以有两个数时,第二个是 每箱 而不是 空位。
把参数写成(物品、空位、每箱)的顺序,或者 Java 重载把收到的值传到错误的位置,都会出错。
JS 中缺少的实参是 undefined,默认值只在 undefined 时才生效,所以不写默认值结果会是 NaN。
Python 可以用 boxes(*nums)、JS 用 boxes(...nums) 把列表展开传入,但 TS 不知道 number[] 的个数,会拒绝展开(TS2556),所以要按个数调用。
向上取整的除法也是陷阱。
物品 // 格数 会漏掉剩下的物品,商 + 1 在整除和 0 个时多一个。
C 的 ceil(items / k) 没有用,因为整数除法已经向下取整了,要用 (items + k - 1) / k。

Pythonmain.py · 9 行
def boxes(items, size=12, gap=0):    per_box = size - gap          # 상자 하나에 담는 물건 수    return (items + per_box - 1) // per_box   # 올림 나눗셈(물건 0개면 0) q = int(input())for _ in range(q):    nums = list(map(int, input().split()))    # 수가 1~3개: 앞에서부터 items, size, gap에 들어가고 빠진 것은 기본값    print(boxes(*nums))
JavaScriptmain.js · 14 行
// 빠진 인자는 undefined가 되고, 기본값은 undefined일 때만 쓰인다function boxes(items, size = 12, gap = 0) {  const perBox = size - gap;  return Math.ceil(items / perBox);} const lines = require("fs").readFileSync(0, "utf8").split("\n");const q = Number(lines[0]);const out = [];for (let i = 1; i <= q; i++) {  const nums = lines[i].trim().split(/\s+/).map(Number);  out.push(boxes(...nums));}console.log(out.join("\n"));
TypeScriptmain.ts · 18 行
import { readFileSync } from "node:fs"; function boxes(items: number, size: number = 12, gap: number = 0): number {  const perBox = size - gap;  return Math.ceil(items / perBox);} const lines: string[] = readFileSync(0, "utf8").split("\n");const q = Number(lines[0]);const out: number[] = [];for (let i = 1; i <= q; i++) {  const nums = lines[i].trim().split(/\s+/).map(Number);  // number[]를 ...로 펼쳐 넘기면 TS가 개수를 몰라 막는다(TS2556) — 개수대로 부른다  if (nums.length === 1) out.push(boxes(nums[0]));  else if (nums.length === 2) out.push(boxes(nums[0], nums[1]));  else out.push(boxes(nums[0], nums[1], nums[2]));}console.log(out.join("\n"));
JavaMain.java · 34 行
import java.io.BufferedReader;import java.io.InputStreamReader; public class Main {    // Java에는 기본값 매개변수가 없다 — 같은 이름의 메서드를 개수별로 두고(오버로드) 긴 쪽에 넘긴다    static long boxes(long items) {        return boxes(items, 12);    }     static long boxes(long items, int size) {        return boxes(items, size, 0);    }     static long boxes(long items, int size, int gap) {        int perBox = size - gap;        return (items + perBox - 1) / perBox;    }     public static void main(String[] args) throws Exception {        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));        int q = Integer.parseInt(br.readLine().trim());        StringBuilder out = new StringBuilder();        for (int i = 0; i < q; i++) {            String[] p = br.readLine().trim().split("\\s+");            long items = Long.parseLong(p[0]);            long r;            if (p.length == 1) r = boxes(items);            else if (p.length == 2) r = boxes(items, Integer.parseInt(p[1]));            else r = boxes(items, Integer.parseInt(p[1]), Integer.parseInt(p[2]));            out.append(r).append('\n');        }        System.out.print(out);    }}
C#Main.cs · 31 行
using System;using System.Text; class Program{    // 기본값은 컴파일할 때 정해지는 상수여야 하고, 기본값이 있는 매개변수는 뒤쪽에 둔다    static long Boxes(long items, int size = 12, int gap = 0)    {        int perBox = size - gap;        return (items + perBox - 1) / perBox;    }     static void Main()    {        int q = int.Parse(Console.ReadLine().Trim());        var sb = new StringBuilder();        for (int i = 0; i < q; i++)        {            string[] p = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries);            long items = long.Parse(p[0]);            long r = p.Length switch            {                1 => Boxes(items),                2 => Boxes(items, int.Parse(p[1])),                _ => Boxes(items, int.Parse(p[1]), int.Parse(p[2])),            };            sb.Append(r).Append('\n');        }        Console.Write(sb);    }}
C++main.cpp · 29 行
#include <iostream>#include <sstream>#include <string>#include <vector> // 기본값은 선언에 한 번만 적고, 기본값이 있는 매개변수는 뒤쪽에 둔다long long boxes(long long items, int size = 12, int gap = 0) {    int perBox = size - gap;    return (items + perBox - 1) / perBox;} int main() {    std::ios::sync_with_stdio(false);    std::string line;    std::getline(std::cin, line);    int q = std::stoi(line);    for (int i = 0; i < q; i++) {        std::getline(std::cin, line);        std::istringstream in(line);        std::vector<long long> v;        long long x;        while (in >> x) v.push_back(x);        long long r;        if (v.size() == 1) r = boxes(v[0]);        else if (v.size() == 2) r = boxes(v[0], (int)v[1]);        else r = boxes(v[0], (int)v[1], (int)v[2]);        std::cout << r << "\n";    }}
Cmain.c · 25 行
#include <stdio.h> /* C에는 기본값 매개변수도 오버로드도 없다 — 부르는 쪽이 빠진 값을 채워 세 개를 모두 넘긴다 */#define DEFAULT_SIZE 12#define DEFAULT_GAP 0 long boxes(long items, int size, int gap) {    int per_box = size - gap;    return (items + per_box - 1) / per_box;} int main(void) {    int q;    char line[128];    if (!fgets(line, sizeof line, stdin)) return 0;    sscanf(line, "%d", &q);    for (int i = 0; i < q; i++) {        fgets(line, sizeof line, stdin);        long items;        int size = DEFAULT_SIZE, gap = DEFAULT_GAP;        sscanf(line, "%ld %d %d", &items, &size, &gap);   /* 읽지 못한 값은 기본값 그대로 */        printf("%ld\n", boxes(items, size, gap));    }    return 0;}
Craykonmain.cray · 24 行
// 크레이콘에는 기본값 매개변수가 없다 — 부르는 쪽이 빠진 값을 채워 세 개를 모두 넘긴다상자수(items, size, gap){    perBox = size - gap;    返回 数学.商(items + perBox - 1, perBox); // 올림 나눗셈} q = 控制台.读行().转数字();循环 (i = 0; i < q; i++){    p = 控制台.读行().去空白().分割(" ");    items = p[0].转数字();    size = 12;    gap = 0;    如果 (p.数量 >= 2)    {        size = p[1].转数字();    }    如果 (p.数量 >= 3)    {        gap = p[2].转数字();    }    控制台.输出(상자수(items, size, gap));}