読者です 読者をやめる 読者になる 読者になる

Problem 26

euler perl


1000以内の数に対して 1 / nを求めたときに最も長い幅の循環少数になる
nを求めろという問題。素数以外の数は素因数分解したときの一番でかいサイズの
素数に依存するのではないかと思うので、対象は素数のみとする。
方針は wikipediaあたりを参考に決定。 10 / nで循環するのであれば、9/nは
割り切れるはずというのを利用しています。ただし 2とか 5は 10を割りきれて
しまうので、そこだけ注意。この素数判定プログラムは早すぎですね。

#!/usr/bin/perl
use strict;
use warnings;

use bigint;
my @primes = (2);
print "Answer is ", p26(1000), "\n"; # Answer is 982

sub p26 {
    my ($limit) = @_;

    map {is_prime($_)}(3..1000);

    my $max = 1;
    for my $i (@primes) {

        my $count = 1;
        while (1) {
            my $value = 10 ** $count;

            last if $value % $i == 0;
            last if ($value - 1) % $i == 0;
            $count++;
        }
        $max = ($count > $max) ? $count : $max;
    }

    return $max;
}

sub is_prime {
    my ($num) = @_;

    for my $i (@primes) {
        last if $i ** 2 > $num;
        return 0 if $num % $i == 0;
    }
    push @primes, $num;
    return 1;
}