- https://leetcode.cn/problems/powx-n/
- 实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即, 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
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/powx-n
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
double myPow(double x, int n) {
}
};
递归
a n { 1 ( n 为 0 ) a n − 1 ∗ a ( n 为奇 ) a n 2 ∗ a n 2 ( n 为偶 ) a^n \left\{\begin{array}{l} 1 (n为0)\\ a^{n-1}*a (n为奇) \\ a^{\frac{n}{2}}*a^{\frac{n}{2}} (n为偶) \end{array}\right. an⎩ ⎨ ⎧1(n为0)an−1∗a(n为奇)a2n∗a2n(n为偶)
class Solution {
public:
double quickMul(double x, long long N) {
if (N == 0) {
return 1.0;
}
if ( N % 2 == 0 ) {
double y = quickMul(x, N / 2);
return y * y ;
}else{
double y = quickMul(x, N -1);
return y * x;
}
}
double myPow(double x, int n) {
long long N = n;
return N >= 0 ? quickMul(x, N) : 1.0 / quickMul(x, -N);
}
};
非递归
a n ,因为题目中指出 n 为整数 , 可将 n 表示为二进制整数 n = b 0 ∗ 2 0 + b 1 ∗ 2 1 + … + b k ∗ 2 k ( b i = 0 或 1 ) a n = a b 0 ∗ 2 0 + b 1 ∗ 2 1 + … + b k ∗ 2 k = ( a 2 0 ) b 0 ∗ … ∗ ( a 2 k ) b k ( a 2 i ) 为底数,以上乘法的基础元素,所以可以用一个循环描述以上乘法 在循环中通过 ( a 2 i ) = ( a 2 i − 1 + 2 i − 1 ) = ( a 2 i − 1 ) ∗ ( a 2 i − 1 ) 计算 ( a 2 i ) 当对应的 n 的二进制数的 b i 为 1 时,将计算的值乘到结果中 a^n,因为题目中指出n为整数,可将n表示为二进制整数\\ n= b_0*2^0+b_1*2^1 + … + b^k*2^k (b_i =0或1)\\ a^n= a^{b_0*2^0+b_1*2^1 + … + b^k*2^k} = (a^{2^0})^{b_0} * … * (a^{2^k})^{b_k} \\ (a^{2^i}) 为底数,以上乘法的基础元素,所以可以用一个循环描述以上乘法\\ 在循环中通过(a^{2^i}) = (a^{2^{i-1} +2^{i-1} }) = (a^{2^{i-1} })* (a^{2^{i-1} }) 计算(a^{2^i})\\ 当对应的n的二进制数的b_i为1时,将计算的值乘到结果中 an,因为题目中指出n为整数,可将n表示为二进制整数n=b0∗20+b1∗21+…+bk∗2k(bi=0或1)an=ab0∗20+b1∗21+…+bk∗2k=(a20)b0∗…∗(a2k)bk(a2i)为底数,以上乘法的基础元素,所以可以用一个循环描述以上乘法在循环中通过(a2i)=(a2i−1+2i−1)=(a2i−1)∗(a2i−1)计算(a2i)当对应的n的二进制数的bi为1时,将计算的值乘到结果中
转二进制
int BinaryOfInt(int i)
{
while(i)
{
if(i & 1)
{
cout<< 1;
}
else
{
cout<< 0;
}
i = i >> 1;
}
return count;
}
// 注 : 以上将int转为二进制只适用于int为正的情况,对输入的负数右移系统仍会保持开头的标志位,负的情况可参考这篇计算负数中有多少个1的文章,其左移1然后与输入数值与,即可计算输入数值的对应二进制的值 https://blog.csdn.net/sdujava2011/article/details/39298031
// 八进制 int 0123; 十六禁止 int 0x15A;
题解
class Solution {
public:
double quickMul(double x, long long N) {
double res = 1.0;
for(int i = N; i != 0; i>>=1){// i /= 2
if(i & 1){ // if(i % 2 != 0){
res *= x;
}
x *= x;
}
return res;
}
double myPow(double x, int n) {
long long N = n;
return N >= 0 ? quickMul(x, N) : 1.0 / quickMul(x, -N);
}
};
- 将循环中的int i = N ,int换为 long long