スキップしてメイン コンテンツに移動

Project Euler - Problem 32

問題

  • 原文

    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;

コメント