import sysSHOWN = 20 # 딱 떨어지지 않을 때 보여 줄 이진 자리 수def to_binary(frac): """소수점 아래 십진 숫자열 frac을 이진 소수로 바꾼다.""" # 실수로 바꾸지 않고 십진 숫자를 하나씩 수로 담는다. 끝의 0은 값에 상관없으니 뗀다 digits = [int(ch) for ch in frac.rstrip("0")] limit = max(len(digits), SHOWN) # d자리 소수가 딱 떨어진다면 d번 안에 끝난다 bits = [] while digits and len(bits) < limit: # 2를 곱한다: 손으로 하듯 맨 끝자리부터 올림을 넘겨 간다 carry = 0 for i in range(len(digits) - 1, -1, -1): v = digits[i] * 2 + carry digits[i] = v % 10 carry = v // 10 bits.append(str(carry)) # 소수점 위로 넘어간 올림이 다음 이진 자리다 while digits and digits[-1] == 0: digits.pop() if not bits: return "0" if not digits: return "0." + "".join(bits) return "0." + "".join(bits[:SHOWN]) + "..."def main(): lines = sys.stdin.read().split() n = int(lines[0]) out = [] for x in lines[1:1 + n]: out.append(to_binary(x[2:])) # 맨 앞의 "0."을 뗀다 print("\n".join(out))main()
JavaScriptmain.js · 28 行
const lines = require("fs").readFileSync(0, "utf8").trim().split(/\s+/);const SHOWN = 20; // 딱 떨어지지 않을 때 보여 줄 이진 자리 수function toBinary(frac) { // Number로 바꾸지 않고 십진 숫자를 하나씩 수로 담는다. 끝의 0은 값에 상관없으니 뗀다 const digits = [...frac.replace(/0+$/, "")].map(Number); const limit = Math.max(digits.length, SHOWN); // d자리 소수가 딱 떨어진다면 d번 안에 끝난다 let bits = ""; while (digits.length > 0 && bits.length < limit) { // 2를 곱한다: 맨 끝자리부터 올림을 넘겨 간다 let carry = 0; for (let i = digits.length - 1; i >= 0; i--) { const v = digits[i] * 2 + carry; digits[i] = v % 10; carry = Math.floor(v / 10); } bits += carry; // 소수점 위로 넘어간 올림이 다음 이진 자리다 while (digits.length > 0 && digits[digits.length - 1] === 0) digits.pop(); } if (bits === "") return "0"; if (digits.length === 0) return "0." + bits; return "0." + bits.slice(0, SHOWN) + "...";}const n = Number(lines[0]);const out = [];for (let i = 1; i <= n; i++) out.push(toBinary(lines[i].slice(2))); // 맨 앞의 "0."을 뗀다console.log(out.join("\n"));
TypeScriptmain.ts · 28 行
const lines: string[] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/);const SHOWN = 20; // 딱 떨어지지 않을 때 보여 줄 이진 자리 수function toBinary(frac: string): string { // number로 바꾸지 않고 십진 숫자를 하나씩 수로 담는다. 끝의 0은 값에 상관없으니 뗀다 const digits: number[] = [...frac.replace(/0+$/, "")].map(Number); const limit = Math.max(digits.length, SHOWN); // d자리 소수가 딱 떨어진다면 d번 안에 끝난다 let bits = ""; while (digits.length > 0 && bits.length < limit) { // 2를 곱한다: 맨 끝자리부터 올림을 넘겨 간다 let carry = 0; for (let i = digits.length - 1; i >= 0; i--) { const v = digits[i] * 2 + carry; digits[i] = v % 10; carry = Math.floor(v / 10); } bits += carry; // 소수점 위로 넘어간 올림이 다음 이진 자리다 while (digits.length > 0 && digits[digits.length - 1] === 0) digits.pop(); } if (bits === "") return "0"; if (digits.length === 0) return "0." + bits; return "0." + bits.slice(0, SHOWN) + "...";}const n: number = Number(lines[0]);const out: string[] = [];for (let i = 1; i <= n; i++) out.push(toBinary(lines[i].slice(2))); // 맨 앞의 "0."을 뗀다console.log(out.join("\n"));
JavaMain.java · 41 行
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class Main { static final int SHOWN = 20; // 딱 떨어지지 않을 때 보여 줄 이진 자리 수 static String toBinary(String frac) { // double이나 long으로 바꾸지 않고 십진 숫자를 하나씩 배열에 담는다 int len = frac.length(); while (len > 0 && frac.charAt(len - 1) == '0') len--; // 끝의 0은 값에 상관없으니 뗀다 int[] digits = new int[len]; for (int i = 0; i < len; i++) digits[i] = frac.charAt(i) - '0'; int limit = Math.max(len, SHOWN); // d자리 소수가 딱 떨어진다면 d번 안에 끝난다 StringBuilder bits = new StringBuilder(); while (len > 0 && bits.length() < limit) { // 2를 곱한다: 맨 끝자리부터 올림을 넘겨 간다 int carry = 0; for (int i = len - 1; i >= 0; i--) { int v = digits[i] * 2 + carry; digits[i] = v % 10; carry = v / 10; } bits.append(carry); // 소수점 위로 넘어간 올림이 다음 이진 자리다 while (len > 0 && digits[len - 1] == 0) len--; } if (bits.length() == 0) return "0"; if (len == 0) return "0." + bits; return "0." + bits.substring(0, SHOWN) + "..."; } public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine().trim()); StringBuilder out = new StringBuilder(); for (int i = 0; i < n; i++) { out.append(toBinary(br.readLine().trim().substring(2))).append('\n'); // 맨 앞의 "0."을 뗀다 } System.out.print(out); }}
C#Main.cs · 45 行
using System;using System.Text;class Program{ const int Shown = 20; // 딱 떨어지지 않을 때 보여 줄 이진 자리 수 static string ToBinary(string frac) { // double이나 decimal로 바꾸지 않고 십진 숫자를 하나씩 배열에 담는다 frac = frac.TrimEnd('0'); // 끝의 0은 값에 상관없으니 뗀다 int len = frac.Length; int[] digits = new int[len]; for (int i = 0; i < len; i++) digits[i] = frac[i] - '0'; int limit = Math.Max(len, Shown); // d자리 소수가 딱 떨어진다면 d번 안에 끝난다 var bits = new StringBuilder(); while (len > 0 && bits.Length < limit) { // 2를 곱한다: 맨 끝자리부터 올림을 넘겨 간다 int carry = 0; for (int i = len - 1; i >= 0; i--) { int v = digits[i] * 2 + carry; digits[i] = v % 10; carry = v / 10; } bits.Append(carry); // 소수점 위로 넘어간 올림이 다음 이진 자리다 while (len > 0 && digits[len - 1] == 0) len--; } if (bits.Length == 0) return "0"; if (len == 0) return "0." + bits; return "0." + bits.ToString(0, Shown) + "..."; } static void Main() { int n = int.Parse(Console.ReadLine()); var sb = new StringBuilder(); for (int i = 0; i < n; i++) { sb.Append(ToBinary(Console.ReadLine().Trim().Substring(2))).Append('\n'); // 맨 앞의 "0."을 뗀다 } Console.Write(sb); }}
C++main.cpp · 43 行
#include <algorithm>#include <iostream>#include <string>#include <vector>using namespace std;const size_t SHOWN = 20; // 딱 떨어지지 않을 때 보여 줄 이진 자리 수string toBinary(const string& frac) { // double로 바꾸지 않고 십진 숫자를 하나씩 수로 담는다 vector<int> digits; for (char ch : frac) digits.push_back(ch - '0'); while (!digits.empty() && digits.back() == 0) digits.pop_back(); // 끝의 0은 값에 상관없으니 뗀다 size_t limit = max(digits.size(), SHOWN); // d자리 소수가 딱 떨어진다면 d번 안에 끝난다 string bits; while (!digits.empty() && bits.size() < limit) { // 2를 곱한다: 맨 끝자리부터 올림을 넘겨 간다 int carry = 0; for (size_t i = digits.size(); i-- > 0;) { int v = digits[i] * 2 + carry; digits[i] = v % 10; carry = v / 10; } bits += static_cast<char>('0' + carry); // 소수점 위로 넘어간 올림이 다음 이진 자리다 while (!digits.empty() && digits.back() == 0) digits.pop_back(); } if (bits.empty()) return "0"; if (digits.empty()) return "0." + bits; return "0." + bits.substr(0, SHOWN) + "...";}int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; for (int i = 0; i < n; i++) { string x; cin >> x; cout << toBinary(x.substr(2)) << '\n'; // 맨 앞의 "0."을 뗀다 } return 0;}
Cmain.c · 40 行
#include <stdio.h>#include <string.h>#define SHOWN 20 /* 딱 떨어지지 않을 때 보여 줄 이진 자리 수 */int main(void) { int n; if (scanf("%d", &n) != 1) return 0; for (int t = 0; t < n; t++) { char x[80]; if (scanf("%79s", x) != 1) return 0; /* double이 아니라 문자열로 읽는다 */ const char *frac = x + 2; /* 맨 앞의 "0."을 건너뛴다 */ int len = (int)strlen(frac); while (len > 0 && frac[len - 1] == '0') len--; /* 끝의 0은 값에 상관없으니 뗀다 */ int digits[64]; for (int i = 0; i < len; i++) digits[i] = frac[i] - '0'; int limit = len > SHOWN ? len : SHOWN; /* d자리 소수가 딱 떨어진다면 d번 안에 끝난다 */ char bits[64]; int count = 0; while (len > 0 && count < limit) { /* 2를 곱한다: 맨 끝자리부터 올림을 넘겨 간다 */ int carry = 0; for (int i = len - 1; i >= 0; i--) { int v = digits[i] * 2 + carry; digits[i] = v % 10; carry = v / 10; } bits[count++] = (char)('0' + carry); /* 소수점 위로 넘어간 올림이 다음 이진 자리다 */ while (len > 0 && digits[len - 1] == 0) len--; } if (count == 0) { printf("0\n"); } else if (len == 0) { printf("0.%.*s\n", count, bits); } else { printf("0.%.*s...\n", SHOWN, bits); } } return 0;}
Craykonmain.cray · 50 行
보일자리 = 20; // 딱 떨어지지 않을 때 보여 줄 이진 자리 수이진으로(소수부){ // 수로 한꺼번에 바꾸지 않고 십진 숫자를 하나씩 목록에 담는다 숫자들 = 新列表(0, 0); 循环 (i = 0; i < 소수부.长度; i++) { 숫자들.添加(소수부.截取(i, 1).转数字()); } // 끝의 0은 값에 상관없으니 뗀다 当 (숫자들.数量 > 0 && 숫자들[숫자들.数量 - 1] == 0) { 숫자들.按位置移除(숫자들.数量 - 1); } 한도 = 数学.较大值(숫자들.数量, 보일자리); // d자리 소수가 딱 떨어진다면 d번 안에 끝난다 비트 = ""; 当 (숫자들.数量 > 0 && 비트.长度 < 한도) { // 2를 곱한다: 맨 끝자리부터 올림을 넘겨 간다 올림 = 0; 循环 (i = 숫자들.数量 - 1; i >= 0; i--) { v = 숫자들[i] * 2 + 올림; 숫자들[i] = v % 10; 올림 = 数学.商(v, 10); } 비트 = 비트 + 올림; // 소수점 위로 넘어간 올림이 다음 이진 자리다 当 (숫자들.数量 > 0 && 숫자들[숫자들.数量 - 1] == 0) { 숫자들.按位置移除(숫자들.数量 - 1); } } 如果 (비트 == "") { 返回 "0"; } 如果 (숫자들.数量 == 0) { 返回 "0." + 비트; } 返回 "0." + 비트.截取(0, 보일자리) + "...";}n = 控制台.读行().转数字();循环 (t = 0; t < n; t++){ x = 控制台.读行().去空白(); 控制台.输出(이진으로(x.截取(2))); // 맨 앞의 "0."을 뗀다}