The number 145 is well known for the property that the sum of the factorial of its digits is equal to 145:

    1! + 4! + 5! = 1 + 24 + 120 = 145

Perhaps less well known is 169, in that it produces the longest chain of numbers that link back to 169; it turns out that there are only three such loops that exist:

    169 → 363601 → 1454 → 169
    871 → 45361 → 871
    872 → 45362 → 872

It is not difficult to prove that EVERY starting number will eventually get stuck in a loop. For example,

    69 → 363600 → 1454 → 169 → 363601 (→ 1454)
    78 → 45360 → 871 → 45361 (→ 871)
    540 → 145 (→ 145)

Starting with 69 produces a chain of five non-repeating terms, but the longest non-repeating chain with a starting number below one million is sixty terms.

How many chains, with a starting number below one million, contain exactly sixty non-repeating terms?

 

다음과 같이, 숫자 145는 각 자릿수의 계승(factorial)의 합과 동일하다는 것이 잘 알려져 있다.

    1! + 4! + 5! = 1 + 24 + 120 = 145

169에 대해 덜 알려진 것은, 169로 다시 돌아오는 데 가장 긴 체인을 만든다는 것이다. 그런 종류의 루프는 단 3가지만 있다:

    169 → 363601 → 1454 → 169
    871 → 45361 → 871
    872 → 45362 → 872

모든 숫자가 루프가 된다는 것을 증명하는 것은 어렵지 않다. 예를 들면 다음과 같다.

    69 → 363600 → 1454 → 169 → 363601 (→ 1454)
    78 → 45360 → 871 → 45361 (→ 871)
    540 → 145 (→ 145)

69로 시작하면 반복되지 않는 5개 항을 가지는 체인을 만든다. 하지만, 1백만 이하의 숫자로 시작해서 가장 긴 반복되지 않는 체인은 60개 항이다.

1백만 이하의 숫자로 시작해서 정확히 60개의 반복되지 않는 항을 가지는 체인은 몇 개 있는가?

--------------------------------------------------------------------------

 

50번 이전의 오일러 프로젝트에 가까운 문제이다. 숫자를 각 자리수로 분해하고 각 숫자에 대한 계승을 합하는 과정을 반복하면서, 이전에 나온 숫자가 다시 나오는지 확인해주고, 체인의 길이가 60개인 경우가 몇 번 나오는지 계산해주면 된다.

 

성능을 위해서 계승을 매번 계산하지 않고 딕셔너리를 활용하는 형태로 구현했다. 지금 생각해보니 딕셔너리의 앞자리 값이 인덱스와 같으므로 튜플이나 리스트 구조로 구현해도 상관없을 것 같다.

 

 

 

 

12345의 숫자 5개에서 3개를 선택하는 방법에는 10가지가 있다.

조합론에서는 5C3=10으로 나타낸다.

일반적으로 r<=n, n!=nx(n-1)x...x3x2x1이고 0!=1일 때, nCr=n!/(r!(n-r)!)이다.

n=23이 되어 23C10=1144066이 되기 전에는 1백만을 넘지 않는다.

1에서 100사이의 n일 때, 몇 개의 nCr이 1백만보다 큰가(서로 다를 필요는 없음)?

--------------------------------------------------------------------------

 

html로 수학 공식을 표현하기 힘들어서 문제를 오일러 프로젝트에서 캡처했고, 조합은 C를 이용해서 표현했다.

 

팩토리얼(계승) 숫자가 기하급수적으로 커지기는 하지만 파이썬에서 다루는 데 아무 문제가 없기 때문에 리스트로 100!까지 미리 구해놓고 계산을 시작했다.

 

n과 r을 이중반복문으로 구성해서 n!을 r! x (n-r)!로 나누고 1백만이 넘는 경우가 몇 개인지 계산하면 되므로 그렇게 어렵지 않게 구할 수 있다.

 

145 is a curious number, as 1! + 4! + 5! = 1 + 24 + 120 = 145.

Find the sum of all numbers which are equal to the sum of the factorial of their digits.

Note: As 1! = 1 and 2! = 2 are not sums they are not included.

 

1! + 4! + 5! = 1 + 24 + 120 = 145이기 때문에, 145는 재미있는 숫자이다.

각 자리 숫자의 계승(팩토리얼)의 합과 동일한 모든 숫자의 합을 구하시오.

주의: 1! = 1과 2! = 2는 합계가 아니므로 포함되지 않는다.

--------------------------------------------------------------------------

 

각 자리수를 활용하는 문제가 많기 때문에 파이썬의 map을 이용하여각 자리 숫자를 리스트로 바꾸고, 리스트를 다시 숫자로 바꾸는 것이 매우 유용하였다.

 

이 문제에서도 상한이 없기 때문에 먼저 정리하는 것이 필요한데, 9!이 362880이기 때문에 9가 8번 반복되더라도 그것을 합하면 29030400이 되는 것을 감안하면 7자리 숫자 내에 답이 있는 것을 알 수 있다. 0!=1인 것까지 고려하여 매번 팩토리얼 계산에 시간을 낭비하지 않도록 팩토리얼 결과값을 리스트로 만들어서 활용하였다.

 

문제를 해결하는 로직은 간단한데, 숫자가 크기 때문에 시간이 많이 소요되었다.

n! means n × (n − 1) × ... × 3 × 2 × 1

For example, 10! = 10 × 9 × ... × 3 × 2 × 1 = 3628800,
and the sum of the digits in the number 10! is 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27.

Find the sum of the digits in the number 100!

 

n!은 n × (n − 1) × ... × 3 × 2 × 1을 뜻한다.

예를 들어, 10! = 10 × 9 × ... × 3 × 2 × 1 = 3628800 이고,

10!의 각 자리 숫자의 합은 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27 이다.

100!의 각 자리 숫자의 합을 구하시오.

--------------------------------------------------------------------------

팩토리얼로 불렀던 !를 사전을 찾아보니 계승이라고 되어 있던데 익숙하지 않은 단어이다.

 

파이썬에서 integer의 크기가 크기 때문에 자료형 고민없이 100!을 구하면 되고, 이것을 리스트 형태로 변환하여 각 자리 숫자를 더하는 방법으로 어렵지 않게 해결하였다.

+ Recent posts