【问题标题】:How to check if a^b is smaller than n如何检查 a^b 是否小于 n
【发布时间】:2017-09-04 19:30:30
【问题描述】:

给定 2 个正整数 ab (1 a^b 。

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

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

谢谢

【问题讨论】:

  • 10000a为底的对数大于b时?

标签: algorithm exponentiation


【解决方案1】:

由于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
    

因此,假设 a = 4b = 7 我们可以得出结论 4**7 &gt; 10000 因为 b = 7 超过了 a = 4 的临界值 (6)

【讨论】:

    【解决方案2】:

    考虑 a,b 为正:

    您可以将变量 result 设置为 1,然后将其乘以 a b 倍。 一旦超过10000,它将永远如此,因此您可以返回

    result 的值永远不会超过 10000 平方,适合整数类型。 (除非 a 大于那,但这意味着你会立即返回)。

    如果 a&gt;1 则不需要更多的日志2 10000 次迭代

    如果a = 1 那么你知道ab=1 也立即

    【讨论】:

    • 我也是这么想的,但是a 可能是 10 亿,所以从 result=a 开始,然后乘以 b-1 次。
    • @danh: a 被给出,所以它适合某种类型(typeof(a)),所以它仍然不会溢出。这样你就没有 b = 0 的特殊情况(我知道我说假设 b 为正)
    • 对,不是 10 gazillion 溢出,而是第一个产品会溢出(10 gazillion square)。我们保存循环的第一次迭代,并避免第一个产品溢出。
    • 我的意思是你和我的算法都不会计算 10 亿平方。无论如何,选择一个是风格问题
    • 我不这么认为。 result=a; iteration=0; while(result&lt;1000 &amp;&amp; iteration&lt;b-1) {...} 当 a 几乎溢出时,我们永远不会到达循环体。 (我希望我能再次在这里投票。我认为从实际计算的角度来看这是一个更好的答案)。
    【解决方案3】:

    如果a&gt;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]);
    

    【讨论】:

      【解决方案4】:

      取不等式两边的a底对数。

      对于正整数ab,下列不等式是等价的:

          ab

          loga(ab) a(10000)

          b a(10000)

      后者可以在没有溢出问题的情况下计算。

      还要注意,change of base formula 可以用 log10 函数编写:

          b·log10(a)

      【讨论】:

      • 请注意,计算对数可能需要离开整数域,因此可能存在精度问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-01
      • 1970-01-01
      • 2013-07-28
      相关资源
      最近更新 更多