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