【发布时间】:2014-08-05 11:53:36
【问题描述】:
你能帮我在不使用任何库(如 java Math.Biginteger)的情况下找到 A^B(A 幂 B)的算法吗?我懂JAVA,如果用java写的代码就好了。
【问题讨论】:
标签: java algorithm biginteger exponentiation
你能帮我在不使用任何库(如 java Math.Biginteger)的情况下找到 A^B(A 幂 B)的算法吗?我懂JAVA,如果用java写的代码就好了。
【问题讨论】:
标签: java algorithm biginteger exponentiation
一个很好的求幂算法是square and multiply
下面我包含了来自同一篇维基百科文章的一些伪代码。
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
【讨论】:
您的问题并未说明是否仅假设参数最多为 9*1018 或结果。这很重要,因为此范围内的最大参数保证会溢出您可以使用的任意数量的 RAM,无论算法如何,您的任务都显然是不可能的。
您的问题没有说明您为什么要使用 Java,而不是 BigInteger,否则它将非常适合该任务。不使用BigInteger 相当于重新实现BigInteger 的部分内容。这是作业吗?
尝试设计这样的算法。一旦你知道怎么做,你就会发现 Java 拥有实现它所需的所有操作:位运算符、移位和乘法。
作为第一步,考虑指数是 2 的幂的情况。您是否能够高效地计算 A2,然后是 A4,然后是 A8,然后是 A16?将这些称为“基本权力”。
如果是:你能结合基本幂的任何其他指数吗? (提示:将指数转换为二进制。例如,A20 = A16+4 = A16 * A4)。
实施它,你就解决了你的任务。
如果您发现上述内容足够简单,作为延伸目标:如果您使用存储所有基本幂的数组实现上述内容,您现在可以优化它,稍微加快您的算法。您一次只需要保留一种基本能力。诀窍是通过使用exponent & 1 != 0 对其进行测试来从指数中提取单个位,并将其所有位右移(使用exponent >>= 1 或exponent /= 2),以便相关位始终处于最低有效位置(使剩余的指数为奇数或偶数)。如果以这种方式遍历指数中的位,则可以在同一个循环中遍历相应的指数,将适用的指数相乘。
如果你做到了这里,你现在有一个平方和乘法的 Java 实现。
【讨论】: