附可运行代码剑指 Offer 16. 数值的整数次方
Posted 来老铁干了这碗代码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了附可运行代码剑指 Offer 16. 数值的整数次方相关的知识,希望对你有一定的参考价值。
立志用最少的代码做最高效的表达
实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。
示例 1:
输入:x = 2.00000, n = 10
输出:1024.00000
示例 2:
输入:x = 2.10000, n = 3
输出:9.26100
示例 3:
输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25
提示:
-100.0 < x < 100.0
-231 <= n <= 231-1
-104 <= xn <= 104
解法一:函数
class Solution {
public double myPow(double x, int n) {
return Math.pow(2.1, -3);
}
}
解法二:快速幂
快速幂原理:
当n为奇数时: a ( n − 1 ) / 2 ∗ a ( n − 1 ) / 2 ∗ a a^{(n-1)/2}*a^{(n-1)/2}*a a(n−1)/2∗a(n−1)/2∗a
当n为偶数时: a n = a n / 2 ∗ a n / 2 a^{n}=a^{n/2}*a^{n/2} an=an/2∗an/2
若看不懂,手推一遍 5 11 5^{11} 511试一下即可。
注意:n要强转为long型,否则当取到int极限值时,会报错
class Solution {
public double myPow(double x, int n) {
if(x == 0) return 0;
double res = 1; // 新底数
long b = n; // 如果直接使用n,会溢出
if(b < 0) { x = 1/x; b = -b; }; // 负数的情况
while(b > 0) {
if((b&1) == 1) res *= x;
x *= x;
b >>= 1;
}
return res;
}
}
可运行代码
public class 剑指Offer16_数值的整数次方 {
// 函数解法
static class Solution1 {
public double myPow(double x, int n) {
return Math.pow(2.1, -3);
}
public static void main(String[] args) {
Solution1 solution1 = new Solution1();
System.out.println(solution1.myPow(2,3));
}
}
// 快速幂(手推一遍例子就懂了)
static class Solution2 {
public double myPow(double x, int n) {
if(x == 0) return 0;
double res = 1; // 新底数
long b = n; // 如果直接使用n,会溢出
if(b < 0) { x = 1/x; b = -b; }; // 负数的情况
while(b > 0) {
if((b&1) == 1) res *= x;
x *= x;
b >>= 1;
}
return res;
}
public static void main(String[] args) {
Solution2 solution2 = new Solution2();
System.out.println(solution2.myPow(2,3));
}
}
}
以上是关于附可运行代码剑指 Offer 16. 数值的整数次方的主要内容,如果未能解决你的问题,请参考以下文章