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
-
JavaScriptのImage()オブジェクトとは?使い方とサンプルコードを解説
JavaScriptにおけるImage()オブジェクトは、HTMLの<img>要素を表すオブジェクトです。このオブジェクトを使うことで、JavaScriptから動的に画像を生成し、Webページに追加することができます。Image()コンストラクタには、引数として画像の幅と高さをピクセル単位で指定できます。また、生成した画像オブジェクトのsrcプロパティに画像のURLを設定することで、画像を読み込むことが可能です。Image()オブジェクトの基本的な使い方以下は、JavaScriptでImage()オブジェクトを使用するサンプルコードです。コード例<!DOCTYPE html&
-
【Windows】「Windowsは問題の解決策を確認しています」が消えないときの対処法
Windows 10でアプリケーションがクラッシュするたびに、エラー報告サービス(Error Reporting Service)が自動的に起動し、解決策の探索を開始します。しかし、解決策が見つからないまま「Windowsは問題の解決策を確認しています」というメッセージで固まってしまうことがあります。この場合、ユーザーが選択できるのは「プログラムを閉じる」のみです。この挙動を止めたい場合は、エラー報告サービス自体を無効化する必要があります。 プログラムが動作を停止しました。Windowsは問題の解決策を確認しています。問題により、プログラムが正しく動作しなくなりました。Windowsはプログ