大数的A ^ B算法(A幂B)

时间:2014-06-15 14:12:01

标签: java algorithm biginteger exponentiation

你可以帮我找到A ^ B(A power B)的Algorithim大数(比如9 * 10 ^ 18)而不使用任何库(比如java Math.Biginteger)吗?我知道JAVA,所以如果用java编写的代码会很棒。

2 个答案:

答案 0 :(得分:1)

一个很好的求幂算法是square and multiply

formula

下面我在同一个维基百科文章中加入了一些伪代码。

1.  y := 1; i := l-1
2.  while i > -1 do
3.      if ni=0 then y:=y2' i:=i-1
4.      else
5.          s:=max{i-k+1,0}
6.          while ns=0 do s:=s+1 [2]
7.          for h:=1 to i-s+1 do y:=y2
8.          u:=(ni,ni-1,....,ns)2
9.          y:=y*xu
10.         i:=s-1
11. return y

答案 1 :(得分:1)

您的问题并未说明是否只假设参数高达9 * 10 18 或结果。这很重要,因为这个范围内的最大参数可以保证溢出你可以使用的任何数量的RAM,无论算法如何,都无法完成任务。

你的问题没有说明为什么你会使用Java而不是BigInteger,否则这将是完美的任务。不使用BigInteger金额来重新实现BigInteger的部分内容。这是家庭作业吗?

尝试设计这样的算法。一旦你知道如何做,你就会发现Java拥有实现它所需的所有操作:按位运算符,移位和乘法。

作为第一步,考虑指数是2的幂的情况。你是否能够有效地计算A 2 ,然后A 4 ,然后A 8 ,然后A 16 ?称这些“基本权力”。

如果是:你能否将任何其他指数与基本权力结合起来? (提示:将指数转换为二进制。例如,A 20 = A 16 + 4 = A 16 * A 4 < / SUP>)。

实施它,你已经解决了你的任务。

如果您发现以上内容足够简单,那么作为一个伸展目标:如果您使用存储所有基本功能的阵列实现上述目标,您现在可以将其优化掉,稍微加快算法速度。您需要一次只保留一个基本功率。诀窍是通过使用exponent & 1 != 0测试来从指数中提取单个位,并将其所有位移位(使用exponent >>= 1exponent /= 2),以便所讨论的位是始终处于最不重要的位置(使指数奇数或偶数保持不变)。如果以这种方式遍历指数中的位,则可以在同一循环中遍历相应的指数,将那些指数相乘。

如果你直到这里,你现在有一个方形和乘法的Java实现。

相关问题