본문 바로가기

오일러프로젝트

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


소수점 뒤에 양의 정수를 차례대로 붙여 나가면 아래와 같은 무리수를 만들 수 있습니다.

0.123456789101112131415161718192021...

이 무리수의 소수점 아래 12번째 자리에는 1이 옵니다 (위에서 붉게 표시된 숫자).

소수점 아래 n번째 숫자를 dn이라고 했을 때, 아래 식의 값은 얼마입니까?

d1 × d10 × d100 × d1000 × d10000 × d100000 × d1000000



일단..
무리수라는건 신경쓰지 않고 단순히 숫자를 string으로 붙여나가서면서
원하는 index를 찾아서 계산하였다. 답변 스레드를보니 자리수에 해당하는 수를
가져오는 공식도 있는듯 하다.

처음에는 그냥 0~ 1000000 (index를 맞춰주기 위해서 0부터 돌림)까지 돌려보았는데
python이나 perl에 비해서 ruby가 속도가 엄청나게 느리다.
인터프리터마다 특성이 좀 있는듯...

 

Python
s=""
for n in range(0, 300000):
s=s+str(n)
if (len(s) > 1000000):
break
r = int(s[1]) * int(s[10]) * int(s[100]) * int(s[1000]) * int(s[10000]) * int(s[100000]) * int(s[1000000])
print(r)
view raw 40.py hosted with ❤ by GitHub

Ruby
s=""
(0..300000).each do |n|
s=s+n.to_s()
if (s.size > 1000000)
break
end
end
puts s
r=s[1].to_i * s[10].to_i * s[100].to_i * s[1000].to_i * s[10000].to_i * s[100000].to_i * s[1000000].to_i
puts r
view raw 40.rb hosted with ❤ by GitHub

Perl
my $s = "";
foreach my $n ((0..300000)) {
$s=$s.$n;
if (length $s > 1000000) {
last;
}
}
my @l = split //, $s;
my $result = $l[1] * $l[10] * $l[100] * $l[1000] * $l[10000] * $l[100000] * $l[1000000];
print "$result \n";
view raw 40.pl hosted with ❤ by GitHub

perl은 계속 결과가 0이 나와서 한참을 디버깅하였는데 결국 원인은 $l을 $1로 써서..아놔.... 변수명 잘 지읍시다...ㅠㅠ