たいちっち

競技プログラミングをしています

【Java】鉄則本_A04_B04

読んでいる本

問題と提出した回答A04

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        String N_binary = Integer.toBinaryString(N);
        String pre_0 = "";//先頭につける0
        //10桁に足りない分だけ0を先頭に付ける
        for (int i = 0; i < (10 - N_binary.length()); i++) {
            pre_0 += "0";
        }
        System.out.println(pre_0 + N_binary);
    }
}

取得した数値を2進数の文字列に変換して、10桁に足りない分だけ、文字列の先頭に「0」を付け足す回答をした。

10進数→2進数の変換は、Integerクラスの

toBinaryString(int i)

整数引数の文字列表現を、基数2の符号なし整数として返します。

を使用した。

 

公式の回答はシフト演算子を使っている。

// 上の桁から順番に「2 進法に変換した値」を求める
        for (int x = 9; x >= 0; x--) {
            int wari = (1 << x); // 2 の x 乗
            System.out.print((N / wari) % 2); // 割り算の結果に応じて 0 または 1 の出力
        }

シフト演算子は使用したことがないので、この機会に使い方をマスターしたい。
「1<<x」はxだけ、数値を左にシフトさせるということらしい。

試すとずらした数値を2乗する形になっていた。

System.out.println(1 << 0); //1       1
System.out.println(1 << 1); //2      10
System.out.println(1 << 2); //4     100
System.out.println(1 << 3); //8    1000
System.out.println(1 << 4); //16  10000
System.out.println(1 << 5); //32 100000

ずらす数だけ2乗している(例:1<<3なら2の3乗)。

公式の回答:kyopro-tessoku/codes/java/chap01/answer_A04.java

問題と提出した回答B04

回答1

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String N = String.valueOf(sc.nextInt());
        int N_10 = Integer.parseInt(N, 2);
        System.out.println(N_10);
    }
}

IntegerクラスのparseIntを使った。

parseInt(String s)
文字列の引数を符号付き10進数の整数型として構文解析します。

回答2

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String N = String.valueOf(sc.nextInt());
        int N_10 = 0;
        for (int i = 0 ; i < N.length(); i++) {
            int tmp = Character.getNumericValue(N.charAt(i));
            if (tmp == 0) {//2の0乗は1になるのでスキップさせる
                continue;
            }
            N_10 += Math.pow(2, tmp * (N.length() -1 -i));
        }
        System.out.println(N_10);
    }
}

入力を文字列で受け取り、for文の中で各桁ごとに10進数に変換して足し合わせた。
文字を数値に変換するのはCharacterクラスのgetNumericValueを使用した。

getNumericValue(char ch)
指定されたUnicode文字が表すint値を返します。

 この変換作業をしないと、値が「49」になってしまう。下の記事を参考にしました。

TODO

  • 他のA,B,C問題を解く
  • 本の続きを読む

 

おわり。。