LoginSignup
1
0

More than 3 years have passed since last update.

10進数を2進数にして順番をつける

Last updated at Posted at 2019-08-02

やりたいこと

10進数を2進数にして順番をつけて区別したい:boy:
例えば77であれば

7 6 5 4 3 2 1
1 0 0 1 1 0 1

のように77の2進数1001101に順番を小さい桁から1、2、3、4、5、6、7と順番をつけて、決められた入力に対応する2進数の数を出力したい。下記に入力例と出力例を示している。

入力値の一行目の1文字目は後に確かめる桁の数を意味する。
例えば下記の入力例で言えば3だが、それは二行目以降3回確かめるべき桁数があるという意味である。

一行目の次の77は2進数に変えるべき数字
二行目以降は確かめるべき桁の数字

入力値 例
3 77
2
5
1

出力値 例
0
0
1

アルゴリズム例

① 2進数を配列にしてそれを反転しインデックスを合わせる

まず77を2進数にして一つずつバラバラにして配列を作る。
その後できた配列を逆順にして新しい配列を作る。
逆順に並んだ配列と入力値-1(インデックスが0始まりになっているため)を組み合わせて
出力

② 指定の桁まで0埋めし、ビット同士比較する

@htsign さんありがとうございます:relaxed:

例えば番号2に対応する2進数の数字を求められたときビットを右にずらし、
該当の桁が一番右に来るようにする。それを1(000001)と&演算子で比較し該当数字も1のとき1となり、それ以外のとき0となるので結果をそのまま出力する。

Javascript コード例

①のアルゴリズム(配列を反転しインデックスを合わせる)


process.stdin.resume();
process.stdin.setEncoding('utf8');

var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});

reader.on('line', (line) => {
  lines.push(line);
});
// ここから主な処理
reader.on('close', () => {
  // 最初の一行目を取得
  var firstLine = lines[0].split(" ");

  // 2進数にする10進数を取得今回の例では77にあたる
  number = parseInt(firstLine[1]);

  // 上記の例では77を2進数にする
  binary = number.toString(2);

  // 2進数を1つずつ配列にする
  reverse = binary.split("");

  var count = 0;

  // 最終的に使用する配列
  collect_array = [];
  // 先ほどの配列を逆順にする(インデックス通りにし、あとで使いやすくするため)
  for (var i = reverse.length -1; i >= 0 ; i--) {
      collect_array[count] = reverse[i];
      count++;
  }
  // 何行問われているのかを取得
  var N = firstLine[0];
  for(var f = 0; f < N; f++) {
    // 逆順にした配列のインデックスは合っているのでそのまま出力
    var line = lines[f+1];
    output_number = collect_array[line - 1];
    console.log(output_number);

  }
});

②のアルゴリズム(0埋めしビット同士比較する)

@htsign さんにご指摘いただいたコードがコメント欄にあります。(動作確認済み)

最後に

問題自体は簡単なのですが、もっと早くて効率の良いアルゴリズムがあるよという方
ぜひコメントで教えてください。

1
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0