파이썬으로 수학문제 풀기- 프로젝트 오일러(project euler, 22번부터)

프로젝트 오일러 36번 문제 - 2진법 대칭숫자(Palindromes)

십진법의 숫자와 이진법으로 변환한 숫자 양쪽 모두 대칭(Palindrome)인 숫자를 찾는 문제입니다.

예를 들면, 십진수 585 는 이진수로 변환하면 1001001001 이고, 십진수와 이진수 양쪽 모두 대칭인 Palindrome 숫자입니다.

이런 성질을 만족하는 수를 백만까지 모두 찾아서 더하는것이 문제입니다.

 

대칭검사

대칭검사(palindrome)은 4번 문제에서 사용했었습니다.

string = 'test'
if string == string[::-1]:
    print('palindrome')
else:
    print('not palindrome')
not palindrome

[::-1] 구문은 문자열 slice 기능인데, 마지막에 -1값을 주게 되면 문자열이 거꾸로 뒤집힙니다. 뒤집어서 같으면 palindrome이겠죠.

10진수 palindrome
for i in range(1,1000):
    if i == int(str(i)[::-1]):
        print(i)
1
2
3
4
5
...
959
969
979
989
999
2진수 변환
for i in range(1,100):
    binary = str(bin(i))
    print(binary)
0b1
0b10
0b11
0b100
0b101
0b110
...

변환하면 앞쪽에 2진수를 표시하는 0b 라는 문자열이 붙어있습니다. 적당히 잘라내고, 나머지 부분만 취해줍니다.

for i in range(1,100):
    binary = str(bin(i))[2:]
    print(binary)
01
10
11
100
101
110
111
...

 

2진 Palindrome
# 2진 palindrome

for i in range(1,100):
    binary = str(bin(i))[2:]
    if binary == binary[::-1]:
        print(i,binary)
1 1
3 11
5 101
7 111
9 1001
15 1111
17 10001
21 10101
27 11011
31 11111
33 100001
...

 

10진수와 2진수 동시에 Palindrome
for i in range(1,100):
    binary = str(bin(i))[2:]
    if i == int(str(i)[::-1]) and binary == binary[::-1]:
        print(i,binary)
1 1
3 11
5 101
7 111
9 1001
33 100001
99 1100011

100만까지 누적
total=0
for i in range(1,1000000):
    binary = str(bin(i))[2:]
    if i == int(str(i)[::-1]) and binary == binary[::-1]:
        total+=i
print(total)

 

 

댓글

댓글 본문