多くの人がオーバーフローに関する質問に答えているようですが、私は彼の元の問題に対処したかったのです。彼は、問題は、すべての数字が繰り返されずに使用されるようにa 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 桁の最大数であるため、上限です (合計 10 桁から a と b のそれぞれに対して 1 を引いた数)。この上限は c のみです。これは、b を 2 から上限まで変化させて計算できるように、指数関数的な成長のため、a と b の境界ははるかに低くなければならないからです。
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' がないことでもわかります)。
それを解決するサンプルコードは次のとおりです。また、これは Python で書かれていることに注意してください。これは、任意精度の整数が必要だからではなく (コードは 9800 万を超えるものは計算しません)、テストの量が非常に少ないため、高水準言語を使用する必要があることがわかったためです。組み込みのコンテナーとライブラリーを利用します (コードには 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)