【发布时间】:2017-09-04 19:30:30
【问题描述】:
给定 2 个正整数 a 和 b (1 a^b 。
问题是我不能只解决 a^b,因为 64^64 的长度足以破坏整数大小。
我怎样才能快速得到这个答案?我想过通过平方来使用求幂,但我还没有想出答案。
谢谢
【问题讨论】:
-
当
10000以a为底的对数大于b时?
给定 2 个正整数 a 和 b (1 a^b 。
问题是我不能只解决 a^b,因为 64^64 的长度足以破坏整数大小。
我怎样才能快速得到这个答案?我想过通过平方来使用求幂,但我还没有想出答案。
谢谢
【问题讨论】:
10000以a为底的对数大于b时?
由于a 和b 都是整数,我们可以得出结论
特例a = 1
a ^ b < 10000 for any b
其他a值可以组织成一个简单的表格
a | critical b
-----------------------------
2 | 13
3 | 8
4 | 6
5..6 | 5
7..9 | 4
10..21 | 3
22..99 | 2
100..9999 | 1
10000.. | no solutions
因此,假设 a = 4、b = 7 我们可以得出结论 4**7 > 10000 因为 b = 7 超过了 a = 4 的临界值 (6)
【讨论】:
考虑 a,b 为正:
您可以将变量 result 设置为 1,然后将其乘以 a b 倍。
一旦超过10000,它将永远如此,因此您可以返回
result 的值永远不会超过 10000 平方,适合整数类型。 (除非 a 大于那,但这意味着你会立即返回)。
如果 a>1 则不需要更多的日志2 10000 次迭代
如果a = 1 那么你知道ab=1 也立即
【讨论】:
a 可能是 10 亿,所以从 result=a 开始,然后乘以 b-1 次。
a 被给出,所以它适合某种类型(typeof(a)),所以它仍然不会溢出。这样你就没有 b = 0 的特殊情况(我知道我说假设 b 为正)
result=a; iteration=0; while(result<1000 && iteration<b-1) {...} 当 a 几乎溢出时,我们永远不会到达循环体。 (我希望我能再次在这里投票。我认为从实际计算的角度来看这是一个更好的答案)。
如果a>1,那么有效指数就只有几个,所以你不妨为每个指数查找a的最大有效值:
maxBases=[0,9999,99,21,9,6,4,3,3,2,2,2,2,2];
if (b<1)
return true;
if (b>13)
return (a <= 1);
else
return (a <= maxBases[b]);
【讨论】:
取不等式两边的a底对数。
对于正整数a和b,下列不等式是等价的:
ab
loga(ab)
b
后者可以在没有溢出问题的情况下计算。
还要注意,change of base formula 可以用 log10 函数编写:
b·log10(a)
【讨论】: