解決策1
真ん中かららせん状に進み、角の数字を単純に要約します:1 + 3 + 5 + 7 + 9 + 13 + 17 + 21 + 25 + ...
このシーケンスでは、後続の各番号がデルタ
d (最初は2、3、5、7、9に等しい)だけ異なることに気付くかもしれません。 この場合、スパイラルの次のラウンドへの移行ごとに、4つの角数間のデルタがさらに2、13、17、21、25増加します。
1回転の角数の合計は次の式で計算されます:
(v + d)+(v + 2 * d)+(v + 3 * d)+(v + 4 * d) 、ここで
vは前の回転の最後の数(1 、9、25、...)、
d-デルタ。 デルタ
dをらせん
サイズのサイズまで増加させることにより、サイクルを構築します。
function task1(size) { for (var v=1, d=2, sum=v; d<size; v+=4*d, d+=2) { sum += 4*v+10*d; } return sum; }
コメントで
eandr_67によって提案された2次シーケンスの合計のような代替ソリューション:
function task1_alt(size) { return (size * size * size * 2 / 3.0 + size * size / 2.0 + size * 4 / 3.0 - 1.5); }
サイズ = 1195のスパイラルの場合、対角線上の数字の合計は1138375521です。