题目
题号:12
题目名:数值的整数次方
编程语言
Java
题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0
初次思路
快速幂(二分):
xn = xn/2 *xn/2 = ((x2))n/2
n/2的值是n/2向下取整,如果n是奇数,那么n/2=[n/2]+1;如果n是偶数,那么n/2=[n/2]
也是就说当x是偶数时:xn = = ((x2))[n/2]
x是奇数时,xn = = x*((x2))[n/2] 因为奇数要剩下一项x
那么最后求xn的时候,直接每次n/2,就将x*x,最后n变成0,x就乘完了
举例:x10=x2*5 =x2*2 * x2*2 * x2
解题代码
public class Solution {
public double Power(double base, int exponent) {
//使用二分快速幂
if(base==0) return 0;
//考虑到指数大小,用Long替换int
long e = exponent;
//如果指数是负数,那要先变成整数
if(e<0) {
base = 1/base;
e = -e;
}
//开始运算x^n = x^n/2 *x^n/2 = ((x^2^))^n/2
//要把指数降成0,由于有可能是奇数,奇数时会多出一项x,直接乘进结果就行
double res =1.0;//用于和x相乘获取最终值
while(e>0) {
//如果是奇数
if(e%2==1) {
res*=base;//将多出的x直接乘入res,最后一次肯定是1,直接将所有base底数乘进去
}
e/=2;
base*=base;//每次二分都会将新的base^2作为底数
}
return res;
}
}