欧拉计划题目3

The prime factors of 13195 are 5, 7, 13 and 29.

What is the largest prime factor of the number 600851475143 ?

http://projecteuler.net/problem=1

13195的质数因子有5,7,13和29.

600851475143的最大质数因子是多少?

http://pe.spiritzhang.com/index.php/2011-05-11-09-44-54/4-3

这个题目的关键是一个求质数的函数(或是判断一个数是否为质数)

#!perl -w
use 5.010;
use strict;
my $num = 600851475143;
sub isprime{
    #验证一个整数(较小)是否为质数,是返回1,否返回0
    my $n = shift;
    state (%prime,@primes, $prime,$maxtest);
    unless($maxtest){
        @primes = (2);
        $prime{2} = 1;
        $maxtest = 2;
    }
    if ($n > $maxtest){
        foreach my $m(($maxtest+1)..$n){
            my $state = 0;
            foreach $prime(@primes){
                if ($prime > sqrt $m){
                    last;
                }
                if ($m % $prime == 0){
                    $prime{$m} = 0;
                    $state = 1;
                    last;
                }
            }
            unless ($state){
                push @primes ,$m;
                $prime{$m} = 1;
            }
        }
        $maxtest = $n;
        return $prime{$n};
    }
    else{
        return $prime{$n};
    }
}
my $i = 2;
while ($num > ($i+1)){
    if (isprime ($i)){
        while ($num % $i == 0){
            $num = $num / $i;
            #say "$num   $i";
        }
    }
    $i++;
}
say $num;

需要说明的是:倒数第八行,是while而不是if,是因为if只判断1次(也只除一次),而一个数的质因子可能重复出现(比如175=5*5*7,质因子只有5和7)。虽然此题中while和if的结果是一样的,但你可以把600851475143换成600851475143 * 71 *839。看看你的程序结果是否还正确。

posted @ 2012-10-07 20:42  qinbin  阅读(172)  评论(0编辑  收藏  举报