我看到很多人回答了有关溢出的问题,但是我想解决他最初的问题。他说,问题是要找到一个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”来看出)。
解决该问题的示例代码如下。还要注意,这是用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)