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 bash
のawk
がGNU 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