题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0
四种题解:
#include<iostream>
#include<cmath>
using namespace std;
//1. 直接调用库函数
double Power1(double base, int exponent)
{
return pow(base,exponent);
}
//2. 暴力法
double Power2(double base, int exponent)
{
if(base==0){
return 0.0;
}
double result=1.0;
int exp;
exp=exponent>0?exponent:-exponent;
while(exp){
result *=base;
--exp;
}
return exponent>0?result:1/result;
}
//3. 位运算
/*base=2.0 exponent=5
2^5=2^(101)=2^(2^2+2^0)=2^(4+1)=2^4*2^1
结果值 result 初始为 1.0
假设base 初始为2.0,此时exponent的二进制最右位为 1,更新结果为:base*result
exponent右移一位。base进行累乘,base更新为2的2次方。由于exponent的二进制最右位为0,不更新结果
exponent右移一位。base进行累乘,base更新为2的 4次方。此时exponent的二进制最右位为1,更新结果为:base*result
结束
*/
double Power3(double base,int exponent)
{
if(base==0){
return 0.0;
}
int exp=exponent>0?exponent:-exponent;
double result=1.0;
while(exp){
if(exp&1==1){
result *= base;
}
exp=exp>>1;
base *= base;
}
return exponent>0?result:1/result;
}
//4. 二分法
/*
如果exponent是偶数,Power(base, exponent) = Power(base, exponent / 2) * Power(base, exponent / 2)
如果exponent是奇数,Power(base, exponent) = base * Power(base, exponent / 2) * Power(base, exponent / 2)
对于负指数exponent的情况,取其绝对值先计算。将最后结果取倒数即可。
*/
double Power4(double base,int exponent)
{
int flag;
flag=exponent>0?1:0;
exponent=abs(exponent);
if(exponent==0){
return 1.0;
}
if(exponent==1){
return flag>0?base:1/base;
}
if(base==0)
return 0.0;
double result= exponent%2 ? base*Power4(base,exponent/2)*Power4(base,exponent/2):Power4(base,exponent/2)*Power4(base,exponent/2);
return flag>0? result:1/result;
}
int main(int argc,char **argv)
{
double b=2.0;
int exp=-1;
cout<<Power1(b,exp)<<endl;
cout<<Power2(b,exp)<<endl;
cout<<Power3(b,exp)<<endl;
cout<<Power4(b,exp)<<endl;
cout<<Power2(0.0,0)<<endl;
cout<<Power2(2.0,0)<<endl;
cout<<Power3(2.0,-5)<<endl;
cout<<Power4(2.0,5)<<endl;
return 0;
}

欢迎点赞!
网友评论