use strict; use warnings; print nearPrime(100000); sub nearPrime { my $num = shift; $_ = 0; return $num if isPrime($num); while (1) { $_++; return ($num - $_) if isPrime($num - $_); return ($num + $_) if isPrime($num + $_); } } BEGIN { my @primes = (2); my $max = 2; sub isPrime { my $num = shift; my $root = int sqrt $num; if ($root > $max) { for (($max+1)..$root) { push(@primes, $_) if isPrime($_); } $max = $root; } for (@primes) { return 0 if ($num % $_ == 0); } return 1; } }