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

JavaScriptでナルシシスト数(水仙数)を判定する方法


ナルシシスト数とは

ナルシシスト数(水仙数・アームストロング数とも呼ばれます)とは、各桁の数字を「桁数」乗した値の合計が、元の数と等しくなるような整数のことです。

例えば次のような数が挙げられます。

153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153

この例では、153は3桁の数なので、各桁を3乗して合計すると元の153に戻ります。同様に、1桁の数はすべて自分自身の1乗と一致するため、次のように1もナルシシスト数です。

1 = 1^1 = 1

他にも、370 = 3³ + 7³ + 0³、1634 = 1⁴ + 6⁴ + 3⁴ + 4⁴ などがナルシシスト数に該当します。

判定アルゴリズムの考え方

ナルシシスト数を判定するには、以下の手順で処理を行います。

まずwhileループを使って、対象の数が何桁あるかを数えます。次に、別のwhileループで数値の下1桁を順番に取り出し、その桁数乗した値を変数sumに加算していきます。すべての桁を処理し終えたら、合計値sumが元の数と一致するかどうかをブール値(true/false)として返します。

コード例

実際の実装は以下のようになります。

const isNarcissistic = (num) => {
    let m = 1, count = 0;
    while(num / m > 1){
        m *= 10;
        count++;
    };
    let sum = 0, temp = num;
    while(temp){
        sum += Math.pow(temp % 10, count);
        temp = Math.floor(temp / 10);
    };
    return sum === num;
};
console.log(isNarcissistic(153));
console.log(isNarcissistic(1634));
console.log(isNarcissistic(1433));
console.log(isNarcissistic(342));

このコードでは、最初のwhileループで変数mを10倍しながら桁数をカウントし、2つ目のwhileループでtemp % 10により下1桁を取得し、Math.pow()で桁数乗して加算しています。Math.floor(temp / 10)で処理済みの桁を取り除くことで、全桁を順に処理できます。

出力結果

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

true
true
false
false

153と1634はナルシシスト数であるためtrue、1433と342は条件を満たさないためfalseが返されています。

  1. JavaScriptで数値の各桁の数字を一つずつ分割表示する方法

    はじめに この記事では、ユーザーが入力した数値を検証し、有効な数値であればその各桁の数字を画面に一つずつ表示するJavaScriptプログラムの作り方を解説します。 動作イメージ ページ上のボタンをクリックすると入力ダイアログが開き、そこに数値を入力してOKを押すと、入力された数値の各桁が一行ずつ画面に出力される仕組みです。 例えば、入力が次のような場合—— 43354 画面には次のように表示されます。 4 3 3 5 4 完成コード HTML <!DOCTYPE html> <html>   <head>   &n

  2. JavaScriptで数字パターンを表示する方法【初心者向けサンプルコード】

    本記事では、テキスト入力欄とボタンを備えたJavaScript・HTMLプログラムの作成方法を解説します。ユーザーが入力欄に任意の数値(例:5)を入力してボタンをクリックすると、画面に以下のような数字パターンが表示される仕組みです。(n = 5 の場合の出力例)01 01 02 01 02 03 01 02 03 04 01 02 03 04 05仕組みのポイントこのパターンは二重ループ(ネストしたforループ)を使うことで実現できます。外側のループが「行」を制御し、内側のループがその行に表示する「数字の個数」を制御します。i 行目には 1 から i までの数字が順番に出力されるため、行が進む