如何更快的球一个整数k的N次方
来源:互联网 发布:数据监控系统毕业设计 编辑:程序博客网 时间:2024/06/01 19:55
题目:
如果更快的求一个整数k的n次方。如果两个整数相乘并得到结果的时间复杂度为O(1),得到整数k的N次方的过程请实现时间复杂度为O(logN)的方法。
给定k和n,请返回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();
}
}
- 如何更快的球一个整数k的N次方
- 计算一个任意整数的n次方
- n的k次方
- 如何机智的判断一个整数是否是2的n次方幂
- N的K次方和
- 求n的k次方
- 实现n的k次方
- 判断一个整数是否是2的N次方
- 判断一个整数x是否是2的N次方。
- 给定一个整数n,判断这个整数是否是2的N次方
- 求一个整数的次方
- 面试题整理-整数的n次方
- 位运算---计算整数的N次方
- 如何有效的实现一个正整数的N次方
- 用递归实现N的K次方
- 求n的k次方 递归
- 用递归实现n的k次方
- 用递归实现n的k次方
- {小结}2016.07.14【初中部 NOIP提高组 】模拟赛B
- poj1410 intersection
- 死锁
- HDOJ 1232 畅通工程(并查集)
- 操作系统第四版习题答案大全
- 如何更快的球一个整数k的N次方
- MySQL数据库系列之建立高性能的索引
- ppt中的对象选择和重命名
- android中TextView中文字从数据库中读取并实现换行
- 自定义类,外面调用的属性是只读,但是可以在自定义类内部设置修改属性
- OpenJ_Bailian 4081 树的转换 数据结构
- App安全之网络传输安全
- 重排链表
- HDU 3607 线段树