【演算法詳解】求解數值的整數次方
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:數值的整數次方
相關文章
- 數值的整數次方
- JZ-012-數值的整數次方
- offer通過--11數值的整數次方-2
- 【leetcode】劍指 Offer 16. 數值的整數次方LeetCode
- 位運算-判斷一個數是否為2的整數次方
- Cplex混合整數規劃求解(Python API)PythonAPI
- 運籌優化(十)--整數規劃求解優化
- numpy中求解範數(numpy.linalg.norm)以及各階範數詳解ORM
- 回溯演算法求解橋本分數式演算法
- 詳解Java判斷是否是整數,小數或實數的正規表示式Java
- [演算法] 兩個質數的乘積是707829217,求解該質數演算法
- 求解數獨
- Python產生20個隨機整數的方法詳解!Python隨機
- 求 10 個整數中的最大值
- c語言中返回整數值的長度C語言
- 【C++】超級詳細,多元一次方程的求解方法C++
- 數數的位數(正整數)
- 垃圾回收的引用計數器演算法詳解演算法
- 詳解 LeetCode_007_整數反轉(Java 實現)LeetCodeJava
- 【數值計算方法】常微分方程數值解-數值實驗
- 實數的三次方根
- 2034 整數的個數
- 在Java中,整數的絕對值不一定是正數Java
- 【簡單演算法】1.兩數之和,給定整數陣列和目標值,找出陣列中2數之和等於目標值的元素演算法陣列
- JS演算法之找出缺失的整數JS演算法
- 變數的解構賦值變數賦值
- 求區間不同數的個數【主席樹求解】
- 一元二次方程求解(C語言),包含複數情況都是C語言
- 斯特林數求解
- 輸入一個整數,返回這個整數的位數
- 從不定方程的非負整數解個數談起
- 伯努利數,求解自然數冪和的關鍵係數
- win10如何調滑鼠dpi數值_win10調整滑鼠dpi數值教程Win10
- 每日一道演算法:羅馬數字轉整數演算法
- 梯度下降法中導數的求解梯度
- Kotlin 變數詳解:宣告、賦值與最佳實踐指南Kotlin變數賦值
- 大數翻倍法求解CRT
- 常用的 wget 引數詳解wget
- find 命令的引數詳解