JavaScriptで指定した数に最も近いギャップフル数を見つける方法
ギャップフル数とは
ギャップフル数(Gapful Number)とは、以下の条件を満たす数のことです。
- 3桁以上の数であること
- 先頭の桁と末尾の桁をつなげてできる数で割り切れること
具体例
例えば、1053は4桁の数であり、先頭と末尾の桁からなる「13」で割り切れるため、ギャップフル数です。同様に、135も3桁の数であり、「15」で割り切れるため、ギャップフル数といえます。
本記事では、入力として与えられた数に最も近いギャップフル数を返すプログラムを作成します。
例えば、すべての2桁の数に対する答えは100となり、103に対する答えは105となります。
実装のアプローチ
この問題は、次の2つの関数に分割して解決します。
isGapful() 関数
数値文字列を受け取り、その数がギャップフル数であるかどうかを真偽値(boolean)で返す関数です。
const isGapful = (numStr) => {
const int = parseInt(numStr);
return int % parseInt(numStr[0] + numStr[numStr.length - 1]) === 0;
};
nearestGapful() 関数
こちらがメインとなる関数で、数値を受け取り、その数に最も近いギャップフル数を返します。
const nearestGapful = (num) => {
if(typeof num !== 'number'){
return -1;
}
if(num <= 100){
return 100;
}
let prev = num - 1, next = num + 1;
while(!isGapful(String(prev)) && !isGapful(String(next))){
prev--;
next++;
};
return isGapful(String(prev)) ? prev : next;
};
isGapful() 関数は定数時間でギャップフル数かどうかを判定し、nearestGapful() 関数は対象の数から上下両方向へ同時に探索し、ギャップフル数が見つかった時点で結果を返します。両側から探索することで、片方向だけを調べる場合に比べて効率よく答えにたどり着けるのがポイントです。
完全なコード例
以下に全体のコードを示します。
const n = 134;
// 数値文字列を受け取り、真偽値を返す
const isGapful = (numStr) => {
const int = parseInt(numStr);
return int % parseInt(numStr[0] + numStr[numStr.length - 1]) === 0;
};
// メイン関数 -- 数値を受け取り、数値を返す
const nearestGapful = (num) => {
if(typeof num !== 'number'){
return -1;
}
if(num <= 100){
return 100;
}
let prev = num - 1, next = num + 1;
while(!isGapful(String(prev)) && !isGapful(String(next))){
prev--;
next++;
};
return isGapful(String(prev)) ? prev : next;
};
console.log(nearestGapful(n));
出力結果
コンソールには次のように出力されます。
135
-
JavaScriptのNumber()関数とは?使い方とサンプルコードを解説
JavaScriptのNumber()関数は、引数として渡された値やオブジェクトを、それに対応する数値へ変換するための関数です。真偽値や文字列型の数字、さらにはDateオブジェクトなども数値に変換できるため、データ型の変換処理において非常に便利な組み込み関数の一つです。例えば、Number(true)は「1」、Number(false)は「0」を返します。また、数字のみで構成された文字列「149」を渡せば数値の149に変換され、new Date()で生成した日付オブジェクトを渡すと、1970年1月1日からの経過ミリ秒数が返されます。以下に、Number()関数の動作を確認できるサンプルコードを
-
JavaScriptで数値が三角数かどうかを判定する方法
三角数(Triangular Number)とは? 三角数とは、点を正三角形の形に敷き詰めたときに現れる数のことです。n番目の三角数は「1からnまでの自然数の合計」として表され、次の公式で求められます。 Tn = n(n+1) / 2 具体的な三角数は 1, 3, 6, 10, 15, 21, 28 … と続きます。例えば 10 は、各辺に4個の点を配置した正三角形を構成できるため、三角数です。 問題 数値を引数として受け取り、その数値が三角数であれば true を、そうでなければ false を返すJavaScript関数を実装します。 判定の考え方 n(n+1)/2 = num となる正