Edited at

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