본문 바로가기

오일러프로젝트

[오일러프로젝트] 37번문제


소수 3797에는 왼쪽부터 자리수를 하나씩 없애거나 (3797, 797, 97, 7) 오른쪽부터 없애도 (3797, 379, 37, 3) 모두 소수가 되는 성질이 있습니다.

이런 성질을 가진 소수는 단 11개만이 존재합니다. 이것을 모두 찾아서 합을 구하세요.

(참고: 2, 3, 5, 7은 제외합니다)


특별한 내용은 없는 문제

 

2,3,5,10등을 이용하여 loop 조건을 더 타이트하게 주었으면 좀 더 빨리 끝났을듯..
def isPrime(n):
n = abs(int(n))
if n < 2:
return False
if n == 2:
return True
if not n & 1:
return False
for x in range(3, int(n**0.5)+1, 2):
if n % x == 0:
return False
return True
result_cnt=0
result_sum=0
n=9
while (result_cnt < 11):
all_prime = True
n_str = str(n)
n_len = len(n_str)
for i in range(0, n_len):
temp = n_str[0:i+1:1]
if not isPrime(temp):
all_prime = False
break
n_str = n_str[::-1]
temp = ""
for i in range(0, n_len):
temp = n_str[i:i+1:1] + temp
if not isPrime(temp):
all_prime = False
break
if all_prime:
result_cnt+=1
result_sum+=n
n+=1
print (result_sum)
print (result_cnt)
view raw 37.py hosted with ❤ by GitHub

Ruby
require 'mathn'
def isPrime(n)
n = n.to_i
return n.prime?
end
result_cnt=0
result_sum=0
n=9
while (result_cnt < 11)
all_prime = true
n_str = n.to_s
n_len = n_str.length
temp=""
(0..n_len-1).each do |i|
temp = temp+n_str[i,1]
unless isPrime(temp)
all_prime = false
break
end
end
temp=""
n_str.reverse!
(0..n_len-1).each do |i|
temp = n_str[i,1] + temp
unless isPrime(temp)
all_prime = false
break
end
end
if all_prime
result_cnt+=1
result_sum+=n
end
n+=1
end
puts result_sum
view raw 37.rb hosted with ❤ by GitHub

Perl
use strict;
use warnings;
sub isPrime
{
my ($number) = @_;
$number = abs $number;
if ($number == 1) {
return 0;
}
my $sqrt = sqrt $number;
my $d = 2;
while (1)
{
return 0 if ( $number % $d == 0 );
return 1 if ( $d > $sqrt );
$d++;
}
}
my $result_cnt=0;
my $result_sum=0;
my $n=9;
while ($result_cnt < 11) {
my $all_prime = 1;
my $n_len = length $n;
my $temp = "";
my $temp2 = "";
foreach my $i ((0..$n_len-1)) {
$temp2 = substr $n, $i, 1;
$temp = $temp.$temp2;
if (!isPrime($temp)) {
$all_prime = 0;
last;
}
}
my $n_reverse = reverse $n;
$temp = "";
foreach my $i ((0..$n_len-1)) {
$temp2 = substr $n_reverse, $i, 1;
$temp = $temp2.$temp;
if (!isPrime($temp)) {
$all_prime=0;
last
}
}
if ($all_prime) {
$result_cnt+=1;
$result_sum+=$n;
}
$n+=1;
}
print "$result_sum";
view raw 37.pl hosted with ❤ by GitHub