我看到很多人回答了关于溢出的问题,但我想解决他原来的问题。他说问题是要找到 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 位数字中的最大数字(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)