태그 보관물: 오일러 프로젝트

오일러 프로젝트 30 번

오일러 프로젝트 30 번

각 자리의 숫자를 4제곱해서 더했을 때 자기 자신이 되는 수는 놀랍게도 단 세 개밖에 없습니다.

1634 = 1**4 + 6**4 + 3**4 + 4**4
8208 = 8**4 + 2**4 + 0**4 + 8**4
9474 = 9**4 + 4**4 + 7**4 + 4**4
(1 = 1**4의 경우는 엄밀히 말해 합이 아니므로 제외합니다)

위의 세 숫자를 모두 더하면 1634 + 8208 + 9474 = 19316 입니다.

그렇다면, 각 자리 숫자를 5제곱해서 더했을 때 자기 자신이 되는 수들의 합은 얼마입니까?

http://euler.synap.co.kr/prob_detail.php?id=30

9**5가 59049이므로, 7자리 수 부터는 이 조건을 만족하는 수가 나올 수 없다. 따라서 999999까지만 검사하면 된다.

def transform(num, n):
    return sum((int(x) ** n for x in str(num)))

def e030():
    result = sum((x for x in range(2, 999999+1) if x == transform(x, 5)))
    print(result)
%time e030()
# 443839
# Wall time: 7.08 s

오일러 프로젝트 28 번

오일러 프로젝트 28 번

숫자 1부터 시작해서 우측으로부터 시계방향으로 감아 5×5 행렬을 만들면 아래와 같이 됩니다.

        21 22 23 24 25
        20  7  8  9 10
        19  6  1  2 11
        18  5  4  3 12
        17 16 15 14 13

여기서 대각선상의 숫자를 모두 더한 값은 101 입니다.

같은 방식으로 1001×1001 행렬을 만들었을 때, 대각선상의 숫자를 더하면 얼마가 됩니까?

http://euler.synap.co.kr/prob_detail.php?id=28

1부터 시작해서 규칙을 따라가보면 쉬운데, 각각의 다음 모서리의 숫자를 구한다. 어이없을만큼 간단한 문제다.

  1. 모서리끼리의 간격은 4회 시행 후 2씩 증가한다.
  2. 한 바퀴를 돌면 변의 길이가 2씩 커지니 1001까지 가려면 500바퀴를 돌면 된다.
def e028():
    a, s, k = 1, 1, 2

    for _ in range(1, 501):
        for _ in range(4):
            a += k
            s += a
        k += 2

    print(s)
%time e028()
# 669171001
# Wall time: 1e+03 µs