# 単純な素因数分解
use strict;
use warnings;
use bigint;
my $n = Math::BigInt->new("600851475143");
my $s = int(sqrt($n));
my @list = ();
my $fmax = 1;
return 1 if $n == 1;
print "$n\n";
for (my $x=2; $x<=$s && $n > 1; $x+=2) {
my $c = 0;
while ($n % $x == 0) {
++$c;
$n /= $x;
}
if ($c > 0) {
push(@list, expr($x,$c));
$fmax = $x;
}
$x = 1 if $x == 2; # $x = {2, 3, 5, 7...} にするためのショボい仕掛け
}
print join(' * ', @list), "\n";
print "Answer: $fmax\n";
sub expr {
my ($b, $p) = @_;
return ($p == 1) ?
sprintf("%d", $b)
:sprintf("%d^%d", $b, $p)
;
}
__END__
実行結果
600851475143
71 * 839 * 1471 * 6857
Answer: 6857