你可以帮我找到A ^ B(A power B)的Algorithim大数(比如9 * 10 ^ 18)而不使用任何库(比如java Math.Biginteger)吗?我知道JAVA,所以如果用java编写的代码会很棒。
答案 0 :(得分:1)
一个很好的求幂算法是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
答案 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 >>= 1
或exponent /= 2
),以便所讨论的位是始终处于最不重要的位置(使指数奇数或偶数保持不变)。如果以这种方式遍历指数中的位,则可以在同一循环中遍历相应的指数,将那些指数相乘。
如果你直到这里,你现在有一个方形和乘法的Java实现。