给出2个正整数 a 和 b (1< a,b< 10000),我想确保 a ^ b< 10000 即可。
问题是我不能只解决一个^ b,因为64 ^ 64的长度足以打破整数大小。
我怎样才能快速得到这个答案?我想通过平方来使用取幂,但我还没有得到答案。
谢谢
答案 0 :(得分:7)
由于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
,因为6
超过a = 4
的临界值({{1}}) }}
答案 1 :(得分:3)
考虑a,b为正:
您可以将变量result
设置为1,然后将其乘以a
b
次。
一旦超过10000
,它将永远是如此,您可以返回
result
的值永远不会超过10000平方,以适合整数类型。 (除非a大于此值,但这意味着你将立即返回。)
如果a>1
那么它将不再需要log 2 10000次迭代
如果a = 1
那么你立即知道 b = 1
答案 2 :(得分:1)
取不平等两边的a-对数。
对于正整数 a 和 b ,以下不等式是等价的:
a b &lt; 10000
log a (a b )&lt;日志<子>一子>(10000)
b&lt;日志<子>一子>(10000)
可以在没有溢出问题的情况下计算后者。
另请注意,使用change of base formula可以使用 log 10 函数编写:
b·log 10 (a)&lt; 4
答案 3 :(得分:1)
如果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]);