【演算法詳解】求解數值的整數次方
1. 問題描述
實現函式:
double power(double base,int exponent)
求base的exponent次方,不使用庫函式,不考慮大數問題。
2. 解法1
考慮邊界問題;
#include <iostream>
#include <string>
using namespace std;
#define DBL_MIN 0.000001
double power(double base, int exponent)
{
if ( base < DBL_MIN && base > -DBL_MIN)
{
return 0.0;
}
double result = 1.0;
int unsignedExponent = exponent;
if (exponent < 0)
{
unsignedExponent = -exponent;
}
for (int i = 1; i < unsignedExponent; i++)
{
result *= base;
}
if (exponent < 0)
{
result = 1.0 / result;
}
return result;
}
int main(int argc, const char * argv[])
{
double base = 12.0;
int exponent = -2;
cout<<"base = "<<base<<"; exponent = "<<exponent<<"; The result is: "<<power(base, exponent)<<endl;
base = 0.0;
exponent = 2;
cout<<"base = "<<base<<"; exponent = "<<exponent<<"; The result is: "<<power(base, exponent)<<endl;
base = -0.000000009;
exponent = 12;
cout<<"base = "<<base<<"; exponent = "<<exponent<<"; The result is: "<<power(base, exponent)<<endl;
return 0;
}
2. 解法2
假設求解32次方,如果已知16次方,那麼只要在16次方的基礎上再平方一次就可以了,而16次方是8次方的平方,一次類推。
#include <iostream>
#include <string>
using namespace std;
#define DBL_MIN 0.000001
double powerUnsignedExponent(double base, int exponent)
{
if (exponent == 0)
{
return 1.0;
}
if (exponent == 1)
{
return base;
}
// exponent >> 1 == exponent / 2
double result = powerUnsignedExponent(base, exponent>>1);
result *= result;
// if exponent is odd
if ((exponent & 0x01) == 1)
{
result *= base;
}
return result;
}
double power(double base, int exponent)
{
if ( base < DBL_MIN && base > -DBL_MIN)
{
return 0.0;
}
double result = 1.0;
int unsignedExponent = exponent;
if (exponent < 0)
{
unsignedExponent = -exponent;
}
result = powerUnsignedExponent(base, unsignedExponent);
if (exponent < 0)
{
result = 1.0 / result;
}
return result;
}
int main(int argc, const char * argv[])
{
double base = 12.0;
int exponent = -2;
cout<<"base = "<<base<<"; exponent = "<<exponent<<"; The result is: "<<power(base, exponent)<<endl;
base = 0.0;
exponent = 2;
cout<<"base = "<<base<<"; exponent = "<<exponent<<"; The result is: "<<power(base, exponent)<<endl;
base = -0.000000009;
exponent = 12;
cout<<"base = "<<base<<"; exponent = "<<exponent<<"; The result is: "<<power(base, exponent)<<endl;
return 0;
}
參考:《劍指offer 名企面試官精講典型程式設計題》 - 面試題11:數值的整數次方
相關文章
- 演算法學習記錄十(C++)--->數值的整數次方演算法C++
- 劍指offer面試題11 數值的整數次方面試題
- 【leetcode】劍指 Offer 16. 數值的整數次方LeetCode
- 數值得整數次方--模擬pow函式的功能函式
- 運籌優化(十)--整數規劃求解優化
- Cplex混合整數規劃求解(Python API)PythonAPI
- 回溯演算法求解橋本分數式演算法
- 詳解Java判斷是否是整數,小數或實數的正規表示式Java
- numpy中求解範數(numpy.linalg.norm)以及各階範數詳解ORM
- javascript將引數轉換為數值程式碼詳解JavaScript
- [演算法] 兩個質數的乘積是707829217,求解該質數演算法
- 【C++】超級詳細,多元一次方程的求解方法C++
- Python產生20個隨機整數的方法詳解!Python隨機
- JavaScript計算數字的多少次方JavaScript
- 一元二次方程求解(C語言),包含複數情況都是C語言
- 垃圾回收的引用計數器演算法詳解演算法
- 在Java中,整數的絕對值不一定是正數Java
- 每日一道演算法:羅馬數字轉整數演算法
- 【簡單演算法】1.兩數之和,給定整數陣列和目標值,找出陣列中2數之和等於目標值的元素演算法陣列
- 變數的解構賦值變數賦值
- C++字串轉整數詳解(安全vs不安全)C++字串
- JS演算法之找出缺失的整數JS演算法
- JavaScript數字開任意次方運算JavaScript
- 【演算法詳解】列印1到最大的n位數演算法
- 我的數學之美(一)——RANSAC演算法詳解演算法
- win10如何調滑鼠dpi數值_win10調整滑鼠dpi數值教程Win10
- js判斷指定的值是否為整數的程式碼JS
- 不借助第三方變數實現兩個整數變數值的互換變數
- 梯度下降法中導數的求解梯度
- 排序演算法-N個正整數排序排序演算法
- 求區間不同數的個數【樹狀陣列求解】陣列
- MYSQL連線相關引數和狀態值詳解MySql
- STL(二十四)數值演算法演算法
- js小數轉整數JS
- 改進版的python求解數獨Python
- find 命令的引數詳解
- 詳解 LeetCode_007_整數反轉(Java 實現)LeetCodeJava
- 面試演算法題(4)--將一個整數陣列中的所有奇數放到偶數前面面試演算法陣列