默认值的写法因语言而异。 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 0long 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));}