数值的整数次方
考点:数学
题目描述、
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0
代码格式要求
public class Solution {
public double Power(double base, int exponent) {
}
}
解题一
1.思路
两个要点:
<< : 左移运算符,num << 1,相当于num乘以2;
>> : 右移运算符,num >> 1,相当于num除以2;
>>> : 无符号右移,忽略符号位,空位都以0补齐(负数用1补齐)
一个整数a, a & 1 这个表达式可以用来判断a的奇偶性。二进制的末位为0表示偶数,最末位为1表示奇数。使用a%2来判断奇偶性和a & 1是一样的作用,但是a & 1要快好多。
2.代码
public class Solution {
public double Power(double base, int exponent) {
if(exponent < 0 && base == 0) throw new RuntimeException("分母不能为0");
int exp = Math.abs(exponent);
if(exponent == 0) return 1;
if(exponent == 1) return base;
//<< : 左移运算符,num << 1,相当于num乘以2
//>> : 右移运算符,num >> 1,相当于num除以2
//>>> : 无符号右移,忽略符号位,空位都以0补齐(负数用1补齐)
double result = Power(base, exp >>> 1);
result *= result;
//一个整数a, a & 1 这个表达式可以用来判断a的奇偶性。
//二进制的末位为0表示偶数,最末位为1表示奇数。
//使用a%2来判断奇偶性和a & 1是一样的作用,但是a & 1要快好多。
if((exp & 1) == 1) {
result *= base;
}
return exponent < 0 ? (1.0 / result) : result;
}
public static void main(String[] args) {
Solution sl = new Solution();
System.out.println(sl.Power(5.0, 3));
}
}
解题二
1.思路
幂的底数和指数的满足情况:
1、底数为零抛出异常但是这里他是底数和指数都为零时才抛出异常。
2、底数不为零,指数为零,返回1
3、底数不为零,指数不为零的情况下,分指数为正负数的时候
·指数为负数的时候先取反不然最高位为1会多乘一次,导致结果不正确,最后面的得数取倒数就可以了。
· 写出指数的二进制表达,例如13表达为二进制1101。
· 举例:10^1101=10。
· 通过&1和>>1来逐位读取1101,为1时将该位代表的乘数累乘到最终结果。
2.代码
public class Solution {
public double Power(double base, int exponent) {
double res = 1,curr = base;
if(exponent == 0){
if(base==0)
throw new RuntimeException("分母不能为0");
else return 1;
}
int e = exponent > 0 ? exponent: -exponent;
while (e != 0) {
res = (e & 1) != 0 ? res * base : res;
base *= base;//这一步特别重要不要忘了,一定要翻倍的
e = e >> 1;
}
return exponent > 0 ? res : 1/res;
}
}
网友评论