您的位置:首页 > 其它

数值的整数次方

2016-03-27 19:01 281 查看
题目描述

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方

算法注意事项:

算法并不是很难,但这里要注意对输入的要求进行检查,例如指数是0的情况,底数是0的情况,底数是-1的情况等。所以这里还是要注意很多问题的。下面是代码,从代码中来学习

 #include<iostream>
using namespace std;

bool InvalidInput = false;
/*
这个equal函数需要注意的地方是比较两个double或者float的数时用哪种方法,这里给出了
一种经典的方法,
*/
bool equal(double num1, double num2){

if((num1 - num2) < 0.0000001 && (num1 - num2) > -0.0000001){
return true;
}
else{
return false;
}
}

/*
计算指数值的核心算法
*/
double powerCore(double base, unsigned int exponent){
if(exponent == 0){      //如果指数是0,那么无论底数是什么,结果都为1,返回即可
return 1;
}
if(exponent == 1){      //如果指数是1,那么就返回底数本身,因为任何数的1次方还是本身
return base;
}
/*
递归算法求出结果,这里用到了优化的算法,对指数分奇数和偶数
*/
double result = powerCore(base, exponent >> 1);
result *= result;

if( (exponent & 0x1) == 1){                 //奇数的情况下,需要再乘以底数
result = result * base;
}

return result;
}

double Power(double base, double exponent){
InvalidInput = false;

if(equal(base, 0.0) && exponent < 0){            //如果底数是0,指数是负数,那么返回标志0.0
InvalidInput = true;
return 0.0;
}

unsigned int absExponent = (unsigned int)(exponent);
if(exponent < 0){
absExponent = (unsigned int )(-exponent);           //如果指数是负数,需要先将指数转化为正数
}

double result = powerCore(base, absExponent);

if(exponent < 0){                                       //如果指数是负数,将结果取倒数即可
result = 1.0 / result;
}

return result;
}

int main(){
/*
写了5组测试的数据
*/
//    double tags = Power(0, -1);
//    double tags = Power(2, -1);
//    double tags = Power(-1, 3);
//    double tags = Power(2, 3);
double tags = Power(9, 0);
if(equal(tags, 0.0)){
cout<<"The invalid input"<<endl;
}
else{
cout<<"the result is "<<tags<<endl;
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: