UNITS = ["B", "KiB", "MiB", "GiB", "TiB"]def human(s): if s < 1024: return f"{s} B" k = 1 while k < 4 and 1024 ** (k + 1) <= s: k += 1 d = 1024 ** k # 정수 거듭제곱이라 정확하다 t = (20 * s + d) // (2 * d) # 소수 첫째 자리까지 반올림한 값 × 10 (0.5는 올림) if t >= 10240 and k < 4: # 1024.0이 되면 다음 단위로 k += 1 d *= 1024 t = (20 * s + d) // (2 * d) return f"{t // 10}.{t % 10} {UNITS[k]}"n = int(input())for _ in range(n): line = input() name, size = line.rsplit(" ", 1) # 이름에 빈칸이 있을 수 있어 마지막 빈칸에서 자른다 print(f"{name}: {human(int(size))}")
JavaScriptmain.js · 24 行
const lines = require("fs").readFileSync(0, "utf8").split("\n");const UNITS = ["B", "KiB", "MiB", "GiB", "TiB"];const human = (s) => { if (s < 1024) return s + " B"; let k = 1; while (k < 4 && 1024 ** (k + 1) <= s) k++; let d = 1024 ** k; // 2의 거듭제곱이라 number로 정확하다 let t = Math.floor((20 * s + d) / (2 * d)); // 소수 첫째 자리까지 반올림한 값 × 10 (0.5는 올림) if (t >= 10240 && k < 4) { // 1024.0이 되면 다음 단위로 k++; d *= 1024; t = Math.floor((20 * s + d) / (2 * d)); } return Math.floor(t / 10) + "." + (t % 10) + " " + UNITS[k];};const n = Number(lines[0]);const out = [];for (let i = 1; i <= n; i++) { const line = lines[i]; const cut = line.lastIndexOf(" "); // 이름에 빈칸이 있을 수 있어 마지막 빈칸에서 자른다 out.push(line.slice(0, cut) + ": " + human(Number(line.slice(cut + 1))));}console.log(out.join("\n"));
TypeScriptmain.ts · 25 行
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");const UNITS: string[] = ["B", "KiB", "MiB", "GiB", "TiB"];const human = (s: number): string => { if (s < 1024) return s + " B"; let k = 1; while (k < 4 && 1024 ** (k + 1) <= s) k++; let d: number = 1024 ** k; // 2의 거듭제곱이라 number로 정확하다 let t: number = Math.floor((20 * s + d) / (2 * d)); // 소수 첫째 자리까지 반올림한 값 × 10 (0.5는 올림) if (t >= 10240 && k < 4) { // 1024.0이 되면 다음 단위로 k++; d *= 1024; t = Math.floor((20 * s + d) / (2 * d)); } return Math.floor(t / 10) + "." + (t % 10) + " " + UNITS[k];};const n = Number(lines[0]);const out: string[] = [];for (let i = 1; i <= n; i++) { const line: string = lines[i]; const cut: number = line.lastIndexOf(" "); // 이름에 빈칸이 있을 수 있어 마지막 빈칸에서 자른다 out.push(line.slice(0, cut) + ": " + human(Number(line.slice(cut + 1))));}console.log(out.join("\n"));
JavaMain.java · 35 行
import java.io.BufferedReader;import java.io.InputStreamReader;public class Main { static final String[] UNITS = {"B", "KiB", "MiB", "GiB", "TiB"}; static String human(long s) { if (s < 1024) return s + " B"; int k = 1; long d = 1024; while (k < 4 && d * 1024 <= s) { // 1024를 곱해 가며 거듭제곱(long이라 넘치지 않는다) d *= 1024; k++; } long t = (20 * s + d) / (2 * d); // 소수 첫째 자리까지 반올림한 값 × 10 (0.5는 올림) if (t >= 10240 && k < 4) { // 1024.0이 되면 다음 단위로 k++; d *= 1024; t = (20 * s + d) / (2 * d); } return t / 10 + "." + t % 10 + " " + UNITS[k]; } public static void main(String[] args) throws Exception { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(in.readLine().trim()); StringBuilder out = new StringBuilder(); for (int i = 0; i < n; i++) { String line = in.readLine(); // 줄 전체를 읽는다 int cut = line.lastIndexOf(' '); // 이름에 빈칸이 있을 수 있어 마지막 빈칸에서 자른다 out.append(line, 0, cut).append(": ").append(human(Long.parseLong(line.substring(cut + 1)))).append('\n'); } System.out.print(out); }}
C#Main.cs · 40 行
using System;using System.Text;class Program{ static readonly string[] Units = { "B", "KiB", "MiB", "GiB", "TiB" }; static string Human(long s) { if (s < 1024) return s + " B"; int k = 1; long d = 1024; while (k < 4 && d * 1024 <= s) // 1024를 곱해 가며 거듭제곱(long이라 넘치지 않는다) { d *= 1024; k++; } long t = (20 * s + d) / (2 * d); // 소수 첫째 자리까지 반올림한 값 × 10 (0.5는 올림) if (t >= 10240 && k < 4) // 1024.0이 되면 다음 단위로 { k++; d *= 1024; t = (20 * s + d) / (2 * d); } return $"{t / 10}.{t % 10} {Units[k]}"; } static void Main() { int n = int.Parse(Console.ReadLine()); var sb = new StringBuilder(); for (int i = 0; i < n; i++) { string line = Console.ReadLine(); // 줄 전체를 읽는다 int cut = line.LastIndexOf(' '); // 이름에 빈칸이 있을 수 있어 마지막 빈칸에서 자른다 sb.Append(line, 0, cut).Append(": ").Append(Human(long.Parse(line.Substring(cut + 1)))).Append('\n'); } Console.Write(sb); }}
C++main.cpp · 32 行
#include <iostream>#include <string>const std::string UNITS[] = {"B", "KiB", "MiB", "GiB", "TiB"};std::string human(long long s) { if (s < 1024) return std::to_string(s) + " B"; int k = 1; long long d = 1024; while (k < 4 && d * 1024 <= s) { // 1024를 곱해 가며 거듭제곱(long long이라 넘치지 않는다) d *= 1024; k++; } long long t = (20 * s + d) / (2 * d); // 소수 첫째 자리까지 반올림한 값 × 10 (0.5는 올림) if (t >= 10240 && k < 4) { // 1024.0이 되면 다음 단위로 k++; d *= 1024; t = (20 * s + d) / (2 * d); } return std::to_string(t / 10) + "." + std::to_string(t % 10) + " " + UNITS[k];}int main() { std::string line; std::getline(std::cin, line); int n = std::stoi(line); for (int i = 0; i < n; i++) { std::getline(std::cin, line); // 줄 전체를 읽는다(>>는 빈칸에서 멈춘다) auto cut = line.rfind(' '); // 이름에 빈칸이 있을 수 있어 마지막 빈칸에서 자른다 std::cout << line.substr(0, cut) << ": " << human(std::stoll(line.substr(cut + 1))) << '\n'; }}
Cmain.c · 40 行
#include <stdio.h>#include <stdlib.h>#include <string.h>static const char* UNITS[] = {"B", "KiB", "MiB", "GiB", "TiB"};void print_human(long long s) { if (s < 1024) { printf("%lld B\n", s); return; } int k = 1; long long d = 1024; while (k < 4 && d * 1024 <= s) { /* 1024를 곱해 가며 거듭제곱(long long이라 넘치지 않는다) */ d *= 1024; k++; } long long t = (20 * s + d) / (2 * d); /* 소수 첫째 자리까지 반올림한 값 × 10 (0.5는 올림) */ if (t >= 10240 && k < 4) { /* 1024.0이 되면 다음 단위로 */ k++; d *= 1024; t = (20 * s + d) / (2 * d); } printf("%lld.%lld %s\n", t / 10, t % 10, UNITS[k]);}int main(void) { char line[128]; fgets(line, sizeof line, stdin); int n = atoi(line); for (int i = 0; i < n; i++) { fgets(line, sizeof line, stdin); /* 줄 전체를 읽는다(끝의 줄바꿈까지) */ line[strcspn(line, "\n")] = '\0'; char* cut = strrchr(line, ' '); /* 이름에 빈칸이 있을 수 있어 마지막 빈칸에서 자른다 */ *cut = '\0'; printf("%s: ", line); print_human(atoll(cut + 1)); } return 0;}
Craykonmain.cray · 40 行
UNITS = ["B", "KiB", "MiB", "GiB", "TiB"];반올림열배(s, d){ // 소수 첫째 자리까지 반올림한 값 × 10 (0.5는 올림). d가 2의 거듭제곱이라 나눗셈이 정확하다 返回 数学.商(20 * s + d, 2 * d);}사람단위(s){ 如果 (s < 1024) { 返回 s + " B"; } k = 1; d = 1024; 当 (k < 4 && d * 1024 <= s) { d *= 1024; // 거듭제곱 연산자가 없으니 1024를 곱해 간다 k += 1; } t = 반올림열배(s, d); 如果 (t >= 10240 && k < 4) { k += 1; // 1024.0이 되면 다음 단위로 d *= 1024; t = 반올림열배(s, d); } 返回 数学.商(t, 10) + "." + t % 10 + " " + UNITS[k];}n = 控制台.读行().转数字();循环 (i = 0; i < n; i++){ // 이름에 빈칸이 있을 수 있어 줄 전체를 읽고 마지막 조각을 크기로 쓴다(이름 안의 빈칸은 하나씩) 조각 = 控制台.读行().分割(" "); 크기 = 조각[조각.数量 - 1].转数字(); 이름 = 조각.子列表(0, 조각.数量 - 1).连接(" "); 控制台.输出(이름 + ": " + 사람단위(크기));}