JavaScriptで数値が4の累乗かどうかを判定する方法
問題
整数 num を唯一の引数として受け取るJavaScript関数を作成する必要があります。この関数は、渡された数値が有効な4の累乗であるかどうかを判定し、4の累乗であれば true を、そうでなければ false を返します。
例えば、関数への入力が次の場合を考えてみましょう。
const num1 = 2356; const num2 = 16;
このとき、期待される出力は次のとおりです。
const output1 = false; const output2 = true;
解決のアプローチ
4の累乗は 4⁰ = 1、4¹ = 4、4² = 16、4³ = 64 のように続きます。そこで、指数 i を 0 から 15 まで変化させながら Math.pow(4, i) を計算し、引数 num と一致するかどうかを順に確認します。32ビット符号付き整数の範囲であれば、最大でも 4 の 15 乗(約 10.7 億)まで判定できれば十分なので、ループは 16 回で対応できます。
コード例
const num1 = 2356;
const num2 = 16;
const isPowerOfFour = (num = 1) => {
let bool = false;
for (let i = 0; i < 16; i++) {
if (Math.pow(4, i) === num) {
bool = true;
return bool;
}
}
return bool;
};
console.log(isPowerOfFour(num1));
console.log(isPowerOfFour(num2));
出力
コンソールには次のように表示されます。
false true
別のアプローチ: ビット演算を活用する
より効率的に判定したい場合は、ビット演算を使う方法があります。4の累乗は2進数で「1 の後に偶数個の 0 が続く」形になります(例: 1 = 0b1、4 = 0b100、16 = 0b10000)。
4の累乗は必ず2の累乗でもあるため、まず (num & (num - 1)) === 0 で2の累乗かどうかを確認し、さらにマスク 0x55555555(2進数で 0101...0101)とのANDを取ることで、4の累乗だけを正確に判定できます。
const isPowerOfFour = (num = 1) => {
return num > 0 && (num & (num - 1)) === 0 && (num & 0x55555555) === num;
};
この方法ならループ処理が不要になり、O(1) の定数時間で判定できるため、パフォーマンスが求められる場面で有効です。
-
JavaScriptのconst宣言とは?再代入できない変数の基本と使い方を解説
JavaScriptのconst宣言は、値を再代入することも後から再宣言することもできない変数を作成するための構文です。constはES2015(ES6)で導入されました。 const宣言の主な特徴 一度値を代入すると、別の値に再代入することはできません。 同じ名前の変数を同じスコープ内で再宣言するとエラーになります。 宣言時に必ず初期値を代入する必要があります。 ブロックスコープ({}内でのみ有効)を持ちます。 それでは、JavaScriptにおけるconst宣言の実際のコードを見ていきましょう。 サンプルコード <!DOCTYPE html> <html>
-
JavaScriptでダブルトン数(Doubleton Number)を判定する方法
ダブルトン数とは 自然数のうち、ちょうど2種類の異なる数字のみで構成されている数を「ダブルトン数(doubleton number)」と呼びます。 例えば、以下の数はダブルトン数です。 23(「2」と「3」の2種類) 35(「3」と「5」の2種類) 100(「1」と「0」の2種類) 12121(「1」と「2」の2種類) 一方、123 は「1」「2」「3」の3種類、9980 は「9」「8」「0」の3種類の数字を含むため、ダブルトン数ではありません。 課題 数値を1つ受け取り、それがダブルトン数であれば true を、そうでなければ false を返すJavaScript関数を作成します。