use strict;
use warnings;
my $magic = 600851475143 ;
sub largestprimef( $) ;
sub max( $$) ;
print largestprimef( $magic) ;
sub largestprimef( $)
{
my $n = shift;
my $i;
return largestprimef( max( 2 , $n/ 2 ) if ( $n % 2 == 0 ) ) ; #UPDATE: There was a bug here where I didn't missed the recursive call. Corrected 20th April 2009.
for ( $i = 3 ; $i <= $sn; $i += 2 ) { if ( $n % $i == 0 ) { last; } } if ( $i > $sn) #loop ran over, means the number is prime
{
return $n;
}
else
{
return max( $i, largestprimef( $n/ $i) ) ;
}
}
sub max( $$)
{
return ( sort { $a <=> $b } ( @_) ) [ 1 ] ;
}
dXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKbXkgJG1hZ2ljID0gNjAwODUxNDc1MTQzOwoKc3ViIGxhcmdlc3RwcmltZWYoJCk7CnN1YiBtYXgoJCQpOwoKcHJpbnQgbGFyZ2VzdHByaW1lZigkbWFnaWMpOwpzdWIgbGFyZ2VzdHByaW1lZigkKQp7Cm15ICRuID0gc2hpZnQ7CgpteSAkaTsKcmV0dXJuIGxhcmdlc3RwcmltZWYobWF4KDIsICRuLzIpIGlmKCRuICUgMiA9PSAwKSk7ICNVUERBVEU6IFRoZXJlIHdhcyBhIGJ1ZyBoZXJlIHdoZXJlIEkgZGlkbid0IG1pc3NlZCB0aGUgcmVjdXJzaXZlIGNhbGwuIENvcnJlY3RlZCAyMHRoIEFwcmlsIDIwMDkuCm15ICRzbiA9IGludChzcXJ0KCRuKSk7Cgpmb3IgKCRpID0gMzsgJGkgPD0gJHNuOyAkaSArPSAyKSAgeyAgICBpZigkbiAlICRpID09IDApICAgIHsgICAgIGxhc3Q7ICAgIH0gICB9ICAgaWYoJGkgPiAkc24pICNsb29wIHJhbiBvdmVyLCBtZWFucyB0aGUgbnVtYmVyIGlzIHByaW1lCnsKcmV0dXJuICRuOwp9CmVsc2UKewpyZXR1cm4gbWF4KCRpLCBsYXJnZXN0cHJpbWVmKCRuLyRpKSk7Cn0KfQoKc3ViIG1heCgkJCkKewpyZXR1cm4gKHNvcnQgeyAkYSA8PT4gJGIgfShAXykpWzFdOwp9