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

JavaScriptで「不器用な階乗(Clumsy Factorial)」問題を解く方法

通常、正の整数 n の階乗は、n 以下のすべての正の整数をかけ合わせた値として定義されます。例えば、factorial(10) = 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 のような形です。

一方、今回取り上げる「不器用な階乗(Clumsy Factorial)」では、整数を降順に並べたうえで、乗算の代わりに「乗算(*)→ 除算(/)→ 加算(+)→ 減算(-)」という固定された順序の演算を繰り返し適用していきます。

例えば、clumsy(10) = 10 * 9 / 8 + 7 - 6 * 5 / 4 + 3 - 2 * 1 となります。ただし、これらの演算は通常の算術と同じ優先順位で評価されます。つまり、加算・減算よりも先にすべての乗算・除算が実行され、乗算・除算同士は左から右へと処理されます。

それでは、この関数をJavaScriptで実装してみましょう。

コード例

const clumsy = num => {
    let k=num;
    let res = 0, temp=1, i=0;
    while(k>0){
        temp = k;
        if(k-1>0){
            temp*=(k-1);
        }
        if(k-2>0){
            temp/=(k-2);
        }
        if(k-3>0){
            if(k===num){
                temp+=(k-3);
            }else{
                temp-=(k-3);
            }
        }
        if(k===num){
            res = temp;
        }else{
            res = res-temp;
        }
        k = k-4;
    }
    return res;
};
console.log(clumsy(4));
console.log(clumsy(10));
console.log(clumsy(16));
console.log(clumsy(5));

アルゴリズムのポイント

この実装では、数列を4つずつのグループに分けて処理します。各グループごとに「かけて、割って、足す(または引く)」という一連の計算をまとめて行い、最初のグループの結果はそのまま答えとして採用し、2グループ目以降は累積結果から差し引いていきます。ループ変数 k は1回ごとに4ずつ減少し、0以下になった時点で処理を終了します。

なお、このコードではJavaScriptの通常の割り算(浮動小数点数の除算)を使用しているため、結果に小数が含まれる点に注意してください。LeetCodeの公式問題では商を切り捨てる整除算が求められるため、その仕様に合わせたい場合は Math.trunc() などを組み合わせて調整するとよいでしょう。

実行結果

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

7
11.75
16.609523809523807
7.666666666666668
  1. JavaScriptのImage()オブジェクトとは?使い方とサンプルコードを解説

    JavaScriptにおけるImage()オブジェクトは、HTMLの<img>要素を表すオブジェクトです。このオブジェクトを使うことで、JavaScriptから動的に画像を生成し、Webページに追加することができます。Image()コンストラクタには、引数として画像の幅と高さをピクセル単位で指定できます。また、生成した画像オブジェクトのsrcプロパティに画像のURLを設定することで、画像を読み込むことが可能です。Image()オブジェクトの基本的な使い方以下は、JavaScriptでImage()オブジェクトを使用するサンプルコードです。コード例<!DOCTYPE html&

  2. 【Windows】「Windowsは問題の解決策を確認しています」が消えないときの対処法

    Windows 10でアプリケーションがクラッシュするたびに、エラー報告サービス(Error Reporting Service)が自動的に起動し、解決策の探索を開始します。しかし、解決策が見つからないまま「Windowsは問題の解決策を確認しています」というメッセージで固まってしまうことがあります。この場合、ユーザーが選択できるのは「プログラムを閉じる」のみです。この挙動を止めたい場合は、エラー報告サービス自体を無効化する必要があります。 プログラムが動作を停止しました。Windowsは問題の解決策を確認しています。問題により、プログラムが正しく動作しなくなりました。Windowsはプログ