JavaScriptで1からnまでの数値名の文字数をカウントする方法
本記事では、数値 n を引数として受け取り、1 から n までの各数値を英語の名称(number name)で表記したときのアルファベットの文字数の合計を求める JavaScript 関数を作成する方法を解説します。
問題の例
まず、具体例で挙動を確認しましょう。n = 5 の場合、対象となる数値名は「one」「two」「three」「four」「five」です。
それぞれの文字数は 3・3・5・4・4 であるため、合計は 19 文字になります。したがって、この場合の出力は 19 となります。
解決アプローチ
この問題を効率的に解くポイントは、毎回数値を文字列に変換して長さを測るのではなく、各桁の英単語の文字数を事前に配列として用意しておくことです。
- 1 の位(0〜9): zero(0)、one(3)、two(3)、three(5)、four(4)、five(4)、six(3)、seven(5)、eight(5)、nine(4)
- 10 の位(10〜90): ten(3)、twenty(6)、thirty(6)、forty(5)、fifty(5)、sixty(5)、seventy(7)、eighty(6)、ninety(6)
- 桁の名称: 「hundred」は 7 文字、「thousand」は 8 文字
さらに、以下の 2 つの特殊ケースへの対応が必要です。
- 11〜19 の数値:「ten」と各数字の組み合わせとして計算し、fourteen・sixteen・seventeen・nineteen のように元の数字とは綴りが異なるものについては +1 文字の補正を行います。
- 101 以上かつ 100 の倍数以外の数値:英語では「one hundred and one」のように「and」が入るため、その分の 3 文字を加算します。
実装コード
以上のロジックを実装したコードがこちらです。
const sumUpto = (num = 1) => {
let sum = 0;
const lenHundred = 7;
const lenThousand = 8;
const lenPlaceOnes = [0,3,3,5,4,4,3,5,5,4];
const lenPlaceTens = [0,3,6,6,5,5,5,7,6,6];
for (let i = 1; i <= num; i++) {
let placeOnes = i % 10;
let placeTens = Math.floor(i / 10) % 10;
let placeHundreds = Math.floor(i / 100) % 10;
let placeThousands = Math.floor(i / 1000) % 10;
sum += lenPlaceOnes[placeOnes];
sum += lenPlaceTens[placeTens];
if (placeHundreds != 0) {
sum += lenHundred + lenPlaceOnes[placeHundreds];
}
if (placeThousands != 0) {
sum += lenThousand + lenPlaceOnes[placeThousands];
}
if (placeTens === 1) {
switch (placeOnes) {
case 4:
case 6:
case 7:
case 9:
sum += 1;
break;
}
}
if (i > 100 && i % 100 != 0) {
sum += 3;
}
}
return sum;
}
console.log(sumUpto(12));
console.log(sumUpto(5));
console.log(sumUpto(122));
出力結果
このコードを実行すると、コンソールには以下の出力が表示されます。
51 19 1280
sumUpto(12) の結果が 51、sumUpto(5) の結果が 19、sumUpto(122) の結果が 1280 となり、1 の位・10 の位・100 の位・1000 の位それぞれの文字数と、「and」や不規則な綴りの補正を正しく反映した計算が行えていることがわかります。
-
JavaScriptのNumber()関数とは?使い方とサンプルコードを解説
JavaScriptのNumber()関数は、引数として渡された値やオブジェクトを、それに対応する数値へ変換するための関数です。真偽値や文字列型の数字、さらにはDateオブジェクトなども数値に変換できるため、データ型の変換処理において非常に便利な組み込み関数の一つです。例えば、Number(true)は「1」、Number(false)は「0」を返します。また、数字のみで構成された文字列「149」を渡せば数値の149に変換され、new Date()で生成した日付オブジェクトを渡すと、1970年1月1日からの経過ミリ秒数が返されます。以下に、Number()関数の動作を確認できるサンプルコードを
-
JavaScriptで配列から三角形を作れる組み合わせの数を数える方法
問題 数値の配列 arr を第一引数(唯一の引数)として受け取る JavaScript 関数を作成します。 この関数の目的は、配列から選んだ3つの数値を三角形の3辺としたときに、実際に三角形が成立する組み合わせ(三つ組)の総数を数えることです。 たとえば、関数への入力が次のようだった場合: const arr = [2, 2, 3, 4]; 期待される出力は次のとおりです。 const output = 3; 出力の解説 有効な組み合わせは以下の3通りです。 2,3,4(1つ目の2を使用) 2,3,4(2つ目の2を使用) 2,2,3 三角形の成立条件 3つの辺 a、b、c(a ≤ b ≤ c