C++ 数值的整数次方 (最小int取反,递归实现乘方)
生活随笔
收集整理的這篇文章主要介紹了
C++ 数值的整数次方 (最小int取反,递归实现乘方)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
劍指 Offer 16. 數(shù)值的整數(shù)次方
難度中等156收藏分享切換為英文接收動態(tài)反饋
實現(xiàn)?pow(x,?n)?,即計算 x 的 n 次冪函數(shù)(即,xn)。不得使用庫函數(shù),同時不需要考慮大數(shù)問題。
示例 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
本題需要考慮底數(shù)x,指數(shù)n,分別大于、等于、小于0等情況:
x=0, n<0:是非法輸入;
n<0:將結(jié)果取倒數(shù);
n=-2147483648的時候,不能對n直接取相反數(shù)。
double類型的兩個數(shù)不能直接用(==)判斷是否相等,要設(shè)置閾值。
C++代碼(注釋的也是一種解法)
// class Solution { // //x=0 時, n不能為負數(shù) // //需要判斷n是否為負 然后決定是否取倒數(shù) // public:// double Power(double x, int n){ // if(n == 0) return 1;//奇數(shù)的最終右移結(jié)果是0 // if(n == 1) return x;//偶數(shù)的最終右移結(jié)果是1 // double res = Power(x, n>>1); // res *= res; // if((n & 0x1) == 1) // //if(n & 1)//如果n是奇數(shù) 就需要多乘一次底數(shù) // res *= x; // return res;// } // bool equal(double a, double b){ // if((a - b) > -0.000001 && (a - b) < 0.000001) // return true; // else // return false; // } // double myPow(double x, int n) {//調(diào)用函數(shù) // if(equal(x, 0.0) && n < 0) return 0.0; // double absn = n; // if(n < 0 && n == INT_MIN) absn = -(absn + 1);//負數(shù)邊界值-2147483648 轉(zhuǎn)為正數(shù)是會溢出的 // else if(n < 0) absn = -n; // double res = Power(x, absn); // if(n < 0) // res = 1.0 / res; // if(x < 0 && n == INT_MIN) res *= -1; // return res;// } // }; class Solution { public:double myPow(double x, int n) {if(n==0) return 1;//考慮到負數(shù)右移永遠是負數(shù),if(n==-1) return 1/x;if(n&1) return myPow(x*x, n>>1)*x;//如果當(dāng)前n是奇數(shù) 遞歸回來到這的時候 需要多乘一次else return myPow(x*x, n>>1);} };?
總結(jié)
以上是生活随笔為你收集整理的C++ 数值的整数次方 (最小int取反,递归实现乘方)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 回溯法模板(矩阵中操作)
- 下一篇: C++去掉字符串首尾的特殊字符(比如空格