多くの人がオーバーフローに関する質問に答えたようですが、私は彼の元の問題に対処したいと思いました。問題は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のみです。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」がないことでも確認できます)。
それを解決するコード例を以下に示します。また、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)