많은 사람들이 오버플로에 대한 질문에 대답 한 것을 보았습니다. 그는 문제는 모든 숫자가 반복되지 않고 사용되도록 b = c 를 찾는 것이라고 말했다 . 좋아, 그는이 게시물에서 요구 한 것이 아니지만 여전히 문제의 상한을 연구하고 그가 오버플로를 계산하거나 감지 할 필요가 없다고 결론을 내릴 필요가 있다고 생각합니다 (참고 : 능숙하지 않습니다. 수학에서는 단계별 로이 작업을 수행했지만 최종 결과는 너무 간단하여 간단한 수식을 가질 수 있습니다).
요점은 문제가 a, b 또는 c에 필요한 상한이 98.765.432라는 것입니다. 어쨌든 사소한 부분과 사소한 부분에서 문제를 나누는 것으로 시작하십시오.
- x 0 == 1 (9, 8, 7, 6, 5, 4, 3, 2의 모든 순열은 해입니다)
- x 1 == x (가능한 해결책 없음)
- 0 b == 0 (가능한 해결책 없음)
- 1 B == 1 (해결책 없음 가능)
- a b , a> 1, b> 1 (사소하지 않음)
이제 우리는 다른 솔루션이 가능하지 않고 순열 만 유효하다는 것을 보여 주어야합니다 (그런 다음 그것을 인쇄하는 코드는 간단합니다). 우리는 상한으로 돌아갑니다. 실제로 상한은 c ≤ 98.765.432입니다. 8 자리 (각 a와 b에 대해 총 10 자리에서 1을 뺀 숫자)가 가장 큰 숫자이므로 상한입니다. 이 상한은 c에만 해당합니다. a와 b에 대한 경계는 지수 성장으로 인해 훨씬 낮아야하기 때문에 b는 2에서 상한까지 다양합니다.
9938.08^2 == 98765432
462.241^3 == 98765432
99.6899^4 == 98765432
39.7119^5 == 98765432
21.4998^6 == 98765432
13.8703^7 == 98765432
9.98448^8 == 98765432
7.73196^9 == 98765432
6.30174^10 == 98765432
5.33068^11 == 98765432
4.63679^12 == 98765432
4.12069^13 == 98765432
3.72429^14 == 98765432
3.41172^15 == 98765432
3.15982^16 == 98765432
2.95305^17 == 98765432
2.78064^18 == 98765432
2.63493^19 == 98765432
2.51033^20 == 98765432
2.40268^21 == 98765432
2.30883^22 == 98765432
2.22634^23 == 98765432
2.15332^24 == 98765432
2.08826^25 == 98765432
2.02995^26 == 98765432
1.97741^27 == 98765432
예를 들어 마지막 줄에 주목하십시오. 1.97 ^ 27 ~ 98M입니다. 따라서 예를 들어 1 ^ 27 == 1 및 2 ^ 27 == 134.217.728이며 9 자리 (2> 1.97이므로 실제로 테스트 해야하는 것보다 큽니다)이므로 해결책이 아닙니다. 알 수 있듯이 a와 b 테스트에 사용할 수있는 조합은 실제로 작습니다. b == 14의 경우 2와 3을 시도해야합니다. b == 3의 경우 2에서 시작하여 462에서 멈 춥니 다. 모든 결과는 ~ 98M보다 작아야합니다.
이제 위의 모든 조합을 테스트하고 숫자를 반복하지 않는 조합을 찾으십시오.
['0', '2', '4', '5', '6', '7', '8'] 84^2 = 7056
['1', '2', '3', '4', '5', '8', '9'] 59^2 = 3481
['0', '1', '2', '3', '4', '5', '8', '9'] 59^2 = 3481 (+leading zero)
['1', '2', '3', '5', '8'] 8^3 = 512
['0', '1', '2', '3', '5', '8'] 8^3 = 512 (+leading zero)
['1', '2', '4', '6'] 4^2 = 16
['0', '1', '2', '4', '6'] 4^2 = 16 (+leading zero)
['1', '2', '4', '6'] 2^4 = 16
['0', '1', '2', '4', '6'] 2^4 = 16 (+leading zero)
['1', '2', '8', '9'] 9^2 = 81
['0', '1', '2', '8', '9'] 9^2 = 81 (+leading zero)
['1', '3', '4', '8'] 3^4 = 81
['0', '1', '3', '4', '8'] 3^4 = 81 (+leading zero)
['2', '3', '6', '7', '9'] 3^6 = 729
['0', '2', '3', '6', '7', '9'] 3^6 = 729 (+leading zero)
['2', '3', '8'] 2^3 = 8
['0', '2', '3', '8'] 2^3 = 8 (+leading zero)
['2', '3', '9'] 3^2 = 9
['0', '2', '3', '9'] 3^2 = 9 (+leading zero)
['2', '4', '6', '8'] 8^2 = 64
['0', '2', '4', '6', '8'] 8^2 = 64 (+leading zero)
['2', '4', '7', '9'] 7^2 = 49
['0', '2', '4', '7', '9'] 7^2 = 49 (+leading zero)
그들 중 어느 것도 문제와 일치하지 않습니다 ( '0', '1', ..., '9'가 없으면 볼 수 있습니다).
이를 해결하는 예제 코드는 다음과 같습니다. 또한 임의의 정밀 정수 (코드가 98 백만보다 큰 것을 계산하지 않음)가 필요하지 않기 때문에 Python으로 작성되었지만 테스트 양이 너무 적어서 고급 언어를 사용해야한다는 것을 알았습니다. 내장 컨테이너 및 라이브러리를 사용하십시오 (참고 : 코드에는 28 줄이 있습니다).
import math
m = 98765432
l = []
for i in xrange(2, 98765432):
inv = 1.0/i
r = m**inv
if (r < 2.0): break
top = int(math.floor(r))
assert(top <= m)
for j in xrange(2, top+1):
s = str(i) + str(j) + str(j**i)
l.append((sorted(s), i, j, j**i))
assert(j**i <= m)
l.sort()
for s, i, j, ji in l:
assert(ji <= m)
ss = sorted(set(s))
if s == ss:
print '%s %d^%d = %d' % (s, i, j, ji)
# Try with non significant zero somewhere
s = ['0'] + s
ss = sorted(set(s))
if s == ss:
print '%s %d^%d = %d (+leading zero)' % (s, i, j, ji)