#author("2017-10-11T20:05:49+09:00","default:nobuoki","nobuoki")
* 問題(和訳) [#w181daf7]
Problem 38 「パンデジタル倍数」
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2038

* 回答例 [#zbd1fc6f]
(awk 'BEGIN{for(i=5000;i<=9999;i++)print i*1,i*2,i*1 i*2}';awk 'BEGIN{for(i=100;i<=333;i++)print i*1,i*2,i*3,i*1 i*2 i*3}';awk 'BEGIN{for(i=25;i<=33;i++)print i*1,i*2,i*3,i*4,i*1 i*2 i*3 i*4}';awk 'BEGIN{for(i=5;i<=9;i++)print i*1,i*2,i*3,i*4,i*5,i*1 i*2 i*3 i*4 i*5}';awk 'BEGIN{for(i=3;i<=9;i++)print i*1,i*2,i*3,i*4,i*5,i*6,i*1 i*2 i*3 i*4 i*5 i*6}';) |awk 'length($NF)==9{print $NF}' |grep 1 |grep 2 |grep 3 |grep 4 |grep 5 |grep 6 |grep 7 |grep 8 |grep 9 |sort -r |head -n 1

* 実行結果 [#kda81ab9]
#pre{{
932718654

real    0m0.032s
user    0m0.000s
sys     0m0.000s
}}

* 解説 [#j073c685]
n > 1 で 9桁の連結積を作ることが出来る数字の桁数の組み合わせは、実は少ない
- n=2: 4 5
- n=3: 3 3 3
- n=4: 2 2 2 3
- n=5: 1 2 2 2 2
- n=6: 1 1 1 2 2 2

例えば n=2 場合、
- 1つめの数字はは必ず 4桁 -> 1000..9999 の範囲
- 2 つめの数字は、必ず 5桁
-- 1 つめの数字 x 2 = 5桁 -> 1 つめの数字数はは 5000..9999 の範囲

という風に、1つめの数字の範囲を絞り込む

あとは素直に全組み合わせを出力し、連結積がパンデジタル数になるものを抽出、
さらにその中で最大のものを抽出する

#prism(bash){{{{
# n=2..6までの連結積を生成する
(
awk 'BEGIN{for(i=5000;i<=9999;i++)print i*1,i*2,                i*1 i*2}';
awk 'BEGIN{for(i=100; i<=333 ;i++)print i*1,i*2,i*3,            i*1 i*2 i*3}';
awk 'BEGIN{for(i=25;  i<=33  ;i++)print i*1,i*2,i*3,i*4,        i*1 i*2 i*3 i*4}';
awk 'BEGIN{for(i=5;   i<=9   ;i++)print i*1,i*2,i*3,i*4,i*5,    i*1 i*2 i*3 i*4 i*5}';
awk 'BEGIN{for(i=3;   i<=9   ;i++)print i*1,i*2,i*3,i*4,i*5,i*6,i*1 i*2 i*3 i*4 i*5 i*6}';
) |
# 連結積が9桁のもののみ抽出
awk 'length($NF)==9{print $NF}' |
# 連結積がパンデジタル数のもののみ抽出
grep 1 |
grep 2 |
grep 3 |
grep 4 |
grep 5 |
grep 6 |
grep 7 |
grep 8 |
grep 9 |
# 最大のパンデジタル数を出力
sort -r | head -n 1
}}}}

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS