問題(和訳)

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2056

回答例

$ time awk 'BEGIN{for(a=1;a<100;a++){for(b=1;b<100;b++){print a"^"b}}}'|BC_LINE_LENGTH=0 bc|sed 's/./&+/g;s/.$//'| bc|LANG=C sort -nr | sed 1q

972

real    0m0.564s
user    0m0.950s
sys     0m0.080s

解説

べき乗は桁数が多いので、awkではなくbcで計算する

 # 100以下の数字のべき乗を計算するための式を生成
 awk 'BEGIN{for(a=1;a<100;a++){for(b=1;b<100;b++){print a"^"b}}}'|
 
 # bc コマンドでべき乗を計算
 BC_LINE_LENGTH=0 bc|
 
 # 数値和の計算式を作る(各桁を '+' 記号でつなぐ)
 sed 's/./&+/g;s/.$//'| 
 
 # bc コマンドで数値和を計算
 bc |
 
 # sortして最大値を表示 
 LANG=C sort -nr | sed 1q

別解

awk 4.1 以降の -M (--bignum) オプションを使うと、bcを使わなくても大丈夫

$ time echo 99 99 | awk -M '{for(i=1;i<=$1;i++){for(j=1;j<=$2;j++){print i^j}}}' | awk '{a=0;for(i=1;i<=length($1);i++){a+=substr($1,i,1)};print a}' | awk '$1>a{a=$1}END{print a}'

972 

real    0m1.013s
user    0m1.076s
sys     0m0.013s

あまり早くない・・・


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-08-15 (火) 22:03:06