やりたいこと
10進数を2進数にして順番をつけて区別したい
例えば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 さんありがとうございます
例えば番号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 さんにご指摘いただいたコードがコメント欄にあります。(動作確認済み)
最後に
問題自体は簡単なのですが、もっと早くて効率の良いアルゴリズムがあるよという方
ぜひコメントで教えてください。