如何更快的球一个整数k的N次方

来源:互联网 发布:数据监控系统毕业设计 编辑:程序博客网 时间:2024/06/01 19:55

题目:

如果更快的求一个整数k的n次方。如果两个整数相乘并得到结果的时间复杂度为O(1),得到整数k的N次方的过程请实现时间复杂度为O(logN)的方法。

给定kn,请返回k的n次方,为了防止溢出,请返回结果Mod 1000000007的值。

测试样例:
2,3
返回:8
解题思路:以10^75为例

75的二进制数是1001011,           10^64  *   10^32  *  10^16  * 10^8 * 10^4  *  10^2  *10^1,其中10^n是不是10^75的分式,与75的二进制相同,1则是0则不是

75的二进制                                        1                0             0              1           0            1         1

所以10^75= 10^64 * 10^8 *   10^2  *10^1

k^n是n的二进制每次右移一位,k每次自乘,但是最终结果是否乘以k自乘的结果看n是否为1,为1结果乘以k自乘的结果,为0则不乘


Java代码:

import java.util.*;
import java.math.BigInteger;
 
public class QuickPower {
    public int getPower(int a, int n) {
        //  BigInteger是不可变的任意精度的整数。所有操作中,都以二进制补码形式表示 BigInteger(如 Java 的基本整数类型)
        BigInteger res = BigInteger.valueOf(1);
        BigInteger tmp = BigInteger.valueOf(a);
        for (; n != 0; n >>= 1) {
            //n>>1表示每次n的二进制每次往右移1位
            //&是位与操作,只有2个都为1时才为1.
            if ((n & 1) != 0) {
                res = res.multiply(tmp);
                // java.math.BigInteger.multiply(BigInteger val) 返回一个BigInteger,其值是 (this * val).
            }
            tmp = tmp.multiply(tmp);
            res = res.mod(BigInteger.valueOf(1000000007));
           // java.math.BigInteger.mod(BigInteger m) 返回一个BigInteger,其值是(this mod m)。
            //    这种方法不同于其它,因为它总是返回一个非负的BigInteger。
            tmp = tmp.mod(BigInteger.valueOf(1000000007));
        }
        return res.mod(BigInteger.valueOf(1000000007)).intValue();
    }
}

0 0
原创粉丝点击