kostumブログ

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

project Euler 012

環境

問題

三角数の数列は自然数の和で表わされ, 7番目の三角数は 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28 である. 三角数の最初の10項は: 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ... となる. 最初の7項について, その約数を列挙すると, 以下のとおり.

 1: 1  3: 1,3  6: 1,2,3,6  10: 1,2,5,10  15: 1,3,5,15  21: 1,3,7,21  28: 1,2,4,7,14,28

これから, 7番目の三角数である28は, 5個より多く約数をもつ最初の三角数であることが分かる. では, 500個より多く約数をもつ最初の三角数はいくつか.

考え方

  1. 三角数の数列をwhile文で計算し、約数が500個になったら、ループを離脱する
  2. 和は数え上げ数の和で計算する
  3. 約数の計算は、1から数え上げていき、その値で和を割り、割り切れた場合、配列に格納する
  4. 3.の割り算が終了したら、配列の長さを求め、500より大きくなったら、ループを離脱する

コード

let num = 1;
let answer = 0;
while (true) {
  let wa = 0;
  for (let i = 1; i <= num; i++) {
    wa = wa + i;
  }
  let yakusuList = [];
  for (let j = 1; j <= wa; j++) {
    if (wa % j == 0) {
      let wararerukazu = wa / j;
      if (wararerukazu < j) {
        break;
      }
      yakusuList.push(j);
    }
  }
  if (yakusuList.length > 250) {
    answer = wa; break;
  }
  num = num + 1;
}
return answer;

説明

  • まず数え始める数、答えを変数として設定する
  • while文で、ある条件(約数が500個以上)になるまでループを続けるようにする
  • 三角数の和を、for文で作成する
  • その和を、さらに数え上げ数で和以下の数まで割る。
  • 約数は割る数と割られる数の大小が入れ替わるところで計算を終了することで、計算量を減らす
  • これより、約数は、半分(250個)まで数えれば良くなるため、それ以上となったら、答えに和を代入し、while文を離脱する