Project Euler

프로젝트 오일러 036

10진법으로도 2진법으로도 모두 대칭수가 되는 백만보다 작은 수들의 합

1분
#project euler #python

대칭수인지 검사하는 방법은 이전 문제에서도 소개했습니다. 문자열로 바꾼 후, s == s[::-1]인지를 검사하면 가장 빠르게 대칭수 여부를 판단할 수 있습니다. 이진수로의 변환은 루르를 돌면서 2로 나눈 나머지를 계속 구하는 방법이 있지만, 내장함수 bin()이 이 역할을 합니다. 다만 bin()의 결과는 앞에 “0b”라는 접두어를 붙이기 때문에, 이 접두어는 빼고 검사해야 합니다.

참고로 모든 짝수는 이진수로 변환했을 때 끝자리가 0이 됩니다. 이 경우는 대칭수가 될 수 없음이 명백하므로, 홀수에 대해서만 검사하면 됩니다.

from euler import timeit

def check(n):
    s = str(n)
    b = bin(n)[2:]
    return s == s[::-1] and b == b[::-1]

@timeit
def main():
    print(sum(x for x in range(1, 100_0000, 2) if check(x)))

if __name__ == '__main__':
    main()