파이썬 실전 프로젝트

프로젝트 오일러 40번 - Champernowne's constant

토픽 파이썬 실전 프로젝트 > 파이썬으로 수학문제 풀기

챔퍼논(?)이라는 수가 있다고 합니다.  위키를 찾아보니 수학적인 원리가 있는것 같긴 한데,, 내용은 잘 모르겠네요. 어쨌든 우리가 해야할일은, 설명대로, 숫자를 줄줄이 이어 붙이면서, 첫째자리, 10번째자리, 100번째자리,,, 백만번째 자리까지, 10의 거듭제곱자리마다 있는 숫자를 찾아서 합치는 것입니다.

1. 일단 무작정 100만번째 자리가 나올때까지 숫자를 이어붙인후에 찾아보고, 혹시 속도나 메모리에 문제가 있으면 다른 방법을 생각해 보기로 하겠습니다.

 

Champernowne's constant

An irrational decimal fraction is created by concatenating the positive integers:

0.123456789101112131415161718192021...

It can be seen that the 12th digit of the fractional part is 1.

If dn represents the nth digit of the fractional part, find the value of the following expression.

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

100자리까지 이어붙이기

i=1;string=''
while len(string)<100: 
    string += str(i)
    print(string)
    i+=1

 

1
12
123
1234
12345
123456
1234567
12345678
123456789
12345678910
1234567891011
123456789101112
12345678910111213
1234567891011121314
....

이상없으면 더 길게 합쳐서 1000자리가 되면 그때의 수만 한번 출력해보겠습니다.

1000자리까지 이어붙이기

i=1;string=''
while len(string)<1000: 
    string += str(i)
    i+=1
print(string)
1234567891011121314151617181920.....................................367368369370

어마어마하게 긴 숫자가 출력됩니다.(정확하게는 문자열입니다.)

문자열이기 때문에, 문자열[100] 이렇게 하면, 100번째 숫자하나만 뽑아낼수 있습니다.

이걸 루프로 만들면,

i=1;string=''
while len(string)<1000: 
    string += str(i)
    i+=1
#print(string)
for i in range(4):
    digit=pow(10,i)
    print(digit,string[digit-1])
1 1
10 1
100 5
1000 3

크게 문제없이 잘되는것 같군요. 그럼 백만까지 늘려주겠습니다.

i=1;string=''
while len(string)<1000000: 
    string += str(i)
    i+=1
total=1
for i in range(7):
    digit=pow(10,i)
    print(digit,string[digit-1])
    total+=int(string[digit-1])*digit
print(total)
1 1
10 1
100 5
1000 3
10000 7
100000 2
1000000 1
1273512

댓글

댓글 본문