{ }codelper
进制转换while 循环P0038

转换为二进制

给出一个非负整数 n。
把 n 转换成二进制输出,不带多余的前导 0。
若 n 为 0,则输出 0。

输入
0 ≤ n ≤ 10^9
输出
一行,n 的二进制表示
样例 1 · stdin
13
stdout
1101
样例 2 · stdin
0
stdout
0
main.py
输入(stdin)

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

$ 就绪

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

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

收集除以 2 的余数时是从低位开始得到的,所以要加在前面,或收集完再反转。
常见陷阱是只写 while (n > 0) —— n = 0 时一次也不循环,输出空行。
先执行一次循环体的 do … while(Java、C#、C、C++、JavaScript、TypeScript)正合适;没有 do 的 Python 和 Craykon 要单独处理 0。
现成工具:Python bin(n)[2:],JavaScript n.toString(2),Java Integer.toBinaryString(n),C# Convert.ToString(n, 2),都会把 0 输出为 "0"。
Craykon 写作 当 (n > 0) { … n = 数学.商(n, 2); };/ 会除出小数,所以用商。

Pythonmain.py · 9 行
n = int(input())if n == 0:    print(0)else:    digits = ""    while n > 0:        digits = str(n % 2) + digits        n //= 2    print(digits)
JavaScriptmain.js · 7 行
let n = Number(require("fs").readFileSync(0, "utf8").trim());let digits = "";do {  digits = (n % 2) + digits;  n = Math.floor(n / 2);} while (n > 0);console.log(digits);
TypeScriptmain.ts · 8 行
import { readFileSync } from "node:fs";let n: number = Number(readFileSync(0, "utf8").trim());let digits = "";do {  digits = (n % 2) + digits;  n = Math.floor(n / 2);} while (n > 0);console.log(digits);
JavaMain.java · 13 行
import java.util.Scanner; public class Main {    public static void main(String[] args) {        int n = new Scanner(System.in).nextInt();        StringBuilder digits = new StringBuilder();        do {            digits.append(n % 2);            n /= 2;        } while (n > 0);        System.out.println(digits.reverse());    }}
C#Main.cs · 17 行
using System;using System.Text; class Program{    static void Main()    {        int n = int.Parse(Console.ReadLine().Trim());        var digits = new StringBuilder();        do        {            digits.Insert(0, n % 2);            n /= 2;        } while (n > 0);        Console.WriteLine(digits);    }}
C++main.cpp · 15 行
#include <algorithm>#include <iostream>#include <string> int main() {    int n;    std::cin >> n;    std::string digits;    do {        digits += char('0' + n % 2);        n /= 2;    } while (n > 0);    std::reverse(digits.begin(), digits.end());    std::cout << digits << '\n';}
Cmain.c · 15 行
#include <stdio.h> int main(void) {    int n;    scanf("%d", &n);    char digits[32];    int len = 0;    do {        digits[len++] = '0' + n % 2;        n /= 2;    } while (n > 0);    for (int i = len - 1; i >= 0; i--) putchar(digits[i]);    putchar('\n');    return 0;}
Craykonmain.cray · 15 行
n = 控制台.读行().转数字();如果 (n == 0){    控制台.输出("0");}否则{    digits = "";    当 (n > 0)    {        digits = n % 2 + digits;        n = 数学.商(n, 2);    }    控制台.输出(digits);}