kostumブログ

勉強したことやノート代わりのアウトプットに使っています。

project Euler 004

環境

問題

左右どちらから読んでも同じ値になる数を回文数という. 2桁の数の積で表される回文数のうち, 最大のものは 9009 = 91 × 99 である.では, 3桁の数の積で表される回文数の最大値を求めよ.

考え方

  1. 3桁の数の積で表される回文数の変数が必要
  2. かける数とかけられる数が必要で、それぞれ 999 ~ 100 までの数
  3. 回文数の最大値を求めるので、999 から求めていく
  4. かけた結果が回文数になるかチェック
  5. かけた結果を1文字ずつの配列に格納して、逆に並べた時の結果と比較する

コード

const question004 = () => {
  let max = 0;
  for (let i = 999; i > 99; i--) {
    for (let j = 999; j > 99; j--) {
      let kaibunsu = i * j;
      let kaibunsuStr = String(kaibunsu);
      let kaibunsuList = kaibunsuStr.split("");
      let reverseKaibunsuList = kaibunsuList.slice().reverse();
      if ( JSON.stringify(kaibunsuList) == JSON.stringify(reverseKaibunsuList) ) {
        if (max < kaibunsu) max = i * j;
      }
    }
  }
  return max;
};

説明

  • まず、最大値を求める変数を設定する
  • かける数は3 桁なので、999 ~ 100 までのループ計算を行う
  • かけられる数も3 桁なので、999 ~ 100 までのループ計算を行う
  • 積を計算し、その数を反転させるために、計算結果を文字列型にし、1 文字ずつ配列に格納する
  • .reverse()で配列の要素を逆順にする。
  • このとき、Array.slice().reverse()とすることで、非破壊的に逆順にすることができる
  • 配列同士の比較は、JSON.stringify()を使うと楽
  • 最後に、その回文数が今までに計算した回文数よりも大きい値かどうかをチェックし、そうならば、最大値を求める変数に代入する