Bash
ProjectEuler
数学

Project Euler Q20 【各位の数字の和 2】

More than 1 year has passed since last update.

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。

問題

$n × (n - 1) × ... × 3 × 2 × 1$ を $n!$ と表す.

例えば, $10! = 10 × 9 × ... × 3 × 2 × 1 = 3628800$ となる.
この数の各桁の合計は $3 + 6 + 2 + 8 + 8 + 0 + 0 = 27$ である.

では, $100!$ の各位の数字の和を求めよ.

解答

seq 100 |
awk 'BEGIN{a[1]=1} {for(i=1;i<=length(a);i++){v[i]=a[i]*$1};for(i=1;i<=158;i++){a[i]=v[i]%10;v[i+1]+=int(v[i]/10)}} END{for(i=length(a);1<=i;i--){printf a[i]}}' |
sed 's/./&\n/g' |
awk '{s+=$1} END{print s}'
648

awkだと$22!$までしか正しく計算できなかった。
$2^{1000}$は計算できたのにな。やり方が悪いのかな。
仕方ないので繰り上がりのロジックをawkで書いた。

2017/11/08追記
taramさんから教えて頂いた内容
GNU awk 4.1以上で、かつ必要なライブラリがインストールされていれば、-Mでできる!

Windowsに入れているgit bashawkGNU Awk 4.1.3, API: 1.1 (GNU MPFR 3.1.3, GNU MP 6.0.0)だったのでやってみました。
(GNU MPというものが必要らしい。)

seq 100 |
awk -M 'BEGIN{s=1} {s*=$1} END{print s}' |
sed 's/./&\n/g' |
awk '{s+=$1} END{print s}'
648

スッキリ!!

答え合わせ

こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/020.html