如何检查^ b是否小于n

时间:2017-04-09 20:27:17

标签: algorithm exponentiation

给出2个正整数 a b (1< a,b< 10000),我想确保 a ^ b< 10000 即可。

问题是我不能只解决一个^ b,因为64 ^ 64的长度足以打破整数大小。

我怎样才能快速得到这个答案?我想通过平方来使用取幂,但我还没有得到答案。

谢谢

4 个答案:

答案 0 :(得分:7)

由于ab都是整数,我们可以得出结论

  1. 特殊情况a = 1

     a ^ b < 10000 for any b
    
  2. 其他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
    
  3. 所以,有a = 4b = 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]);
相关问题