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()