問題
-
Find the sum of all products whose multiplicand/multiplier/product identity can be written as a 1 through 9 pandigital.
-
掛けられる数/掛ける数/積に1から9の数が1回ずつ出現するような積の総和を求めよ.
解答
n桁×m桁の数の積はn+m-1桁かn+m桁になる(e.g. 10×10=100, 99×99=9,801)ので、桁数の合計が9になるとき、積の桁数は4桁であることが分かります。つまり、調べる積の範囲は1,000から9,999までとなります。
あとは数字が重複していないかどうかの判定ですが、積・乗数・被乗数を並べて数字列を作り、小さい順に並べ替えて123456789になれば重複していないことになります。 例えば4396=28×157の場合、並べて書くと439628157という数字列ができます。これを並べ替えると123456789になりますから、4396は答えの1つであることが分かります。
乗数の取り得る範囲は1から積の平方根の間ですが、1の時は積と被乗数が同じになるので明らかに答えではありません。従って2から開始すると少しだけ早くなります。
#!/usr/bin/env perl
use strict;
use warnings;
use feature qw/say/;
use List::Util qw/sum/;
use List::MoreUtils qw/any/;
say sum grep {
my $n = $_;
any {
join('', sort split //, $n . $_ . $n / $_) eq '123456789';
} grep { $n % $_ == 0 } 2 .. sqrt $n;
} 1000 .. 9999;
コメント
コメントを投稿