JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

【JavaScript】数学ライブラリを使わずに完全平方数を判定する方法

本記事では、Math.sqrt() などの数学ライブラリを使用せずに、渡された数値が完全平方数かどうかを判定してブール値(true / false)を返すJavaScript関数の実装方法を解説します。

完全平方数とは

完全平方数とは、ある整数を自分自身と掛け合わせた(2乗した)結果として得られる数のことです。例えば、4は「2 × 2」、81は「9 × 9」なので、どちらも完全平方数です。

完全平方数の例

4, 16, 81, 256, 441, 729, 9801

実装の方針

数学ライブラリが使えない場合の基本的な考え方はシンプルです。1から順に整数を2乗していき、対象の数と一致するかを確認するという線形探索のアプローチを取ります。2乗した値が対象の数を超えた時点で、それ以上一致することはないため探索を終了できます。

サンプルコード

const isPerfectSquare = num => {
   // 負の数は完全平方数になり得ない
   if(num < 0) return false;

   let ind = 0;
   // ind の2乗が num を超えるまで繰り返す
   while(ind * ind < num){
      ind++;
   }
   return ind * ind === num;
};

console.log(isPerfectSquare(81));
console.log(isPerfectSquare(9801));
console.log(isPerfectSquare(99));
console.log(isPerfectSquare(441));
console.log(isPerfectSquare(7648));

コードの解説

  • まず、負の数は2乗しても絶対に得られないため、早期に false を返します。

  • 変数 ind を 0 で初期化し、while ループ内で「ind × ind」が num 未満である間、ind を1ずつ増やします。

  • ループを抜けた時点で「ind × ind」と num が一致すれば完全平方数なので true、一致しなければ false を返します。

  • この書き方なら num が 0 の場合も正しく true と判定されます(0 = 0 × 0)。

実行結果

コンソールには以下のように出力されます。

true
true
false
true
false

計算量と注意点

このアプローチの時間計算量は O(√n) です。日常的な用途では十分な速度ですが、非常に大きな数値を頻繁に判定する場合は、二分探索を組み合わせることでさらに効率化できます。また、厳密な整数演算が必要な場面では、浮動小数点数の誤差が問題になる Math.sqrt() を使わないこの手法が特に有効です。

  1. ライブラリ不要!JavaScriptで日付に日数を加算する方法

    JavaScriptで日付に1日(または任意の日数)を加算するには、組み込みのsetDateメソッドを使うのが最もシンプルで確実な方法です。外部ライブラリは一切不要で、標準のDateオブジェクトだけで実現できます。ここでは、Dateオブジェクトのプロトタイプに独自メソッドを追加して、どの日付オブジェクトからでも簡単に日数を加減算できるようにする実装を紹介します。実装例:addDaysメソッドを定義するDate.prototype.addDays = function(days) { let d = new Date(this.valueOf()); d.setDate(d.getDat

  2. JavaScriptでチェックボックスのオン/オフを切り替える方法【サンプルコード付き】

    Webフォームや設定画面などでは、「ボタンをクリックするとチェックボックスの状態が反転する」という動作を実装したいケースがあります。本記事では、JavaScriptを使ってチェックボックスのオン/オフを簡単に切り替える方法を、実際に動くサンプルコードとともに解説します。 実装のポイント チェックボックスのオン/オフ状態は、DOM要素の checked プロパティで管理されています。この値が true ならチェック済み、false なら未チェックです。ボタンのクリックイベント内でこの値を読み取って反転させれば、トグル動作はわずか数行のコードで実現できます。 コード例 以下は、JavaScript