剑指Offer16_数值的整数次方(快速幂及拓展)
程序员文章站
2022-10-03 15:30:46
base=0,exponent<0是非法输入,给用户提示输入错误提高运算效率:public class 剑指Offer_16_数值的整数次方 { //递归!! 分治的思想! 时间O(logN) 空间 O(logN) public double myPow(double x, int n) { //确定递归基! if (n == 0) return 1; if (n == -1) return 1 / x; ......
- base=0,exponent<0是非法输入,给用户提示输入错误
- 提高运算效率:
public class 剑指Offer_16_数值的整数次方 {
//递归!! 分治的思想! 时间O(logN) 空间 O(logN)
public double myPow(double x, int n) {
//确定递归基!
if (n == 0) return 1;
if (n == -1) return 1 / x;
double haft = myPow(x, n >> 1);
haft *= haft;
return (n & 1) == 1 ? haft * x : haft;
}
// 利用 二进制的 特征
public double myPow2(double x, int n) {
//细节
long y = n < 0 ? -((long) n) : n;
double res = 1;
while (y > 0) {
// 如果最后一个二进制位是1,就累乘上x
if ((y & 1) == 1) res *= x;
x *= x;
y >>= 1;
}
return x < 0 ? (1 / res) : res;
}
// 快速幂补充!!
//请设计一个算法求 的 次幂模 的结果:x^y%z(X,Y)都可能是很大的数
//公式:: (a*b)%p ==((a%p)*(b%p)%p
public static int powMod1(int x, int y, int z) {
if (y < 0 || z == 0 )return 0;
int res =1 % z;
while (y > 0 ){
if ((y & 1) == 1){
res = (res*x) % z;
}
x = (x * x)%z;
y>>=1 ;
}
return res;
}
public static int powMod(int x, int y, int z) {
if (y < 0 || z == 0) return 0;
if (y == 0) return 1 % z;
int half = powMod(x, y >> 1, z);
half *= half;
if ((y & 1) == 0) { // 偶数
return half % z;
} else { // 奇数
return (half * (x % z)) % z;
}
}
}
本文地址:https://blog.csdn.net/weixin_45399846/article/details/107558327