数值的整数次方
2016-03-27 19:01
281 查看
题目描述:
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
算法注意事项:
算法并不是很难,但这里要注意对输入的要求进行检查,例如指数是0的情况,底数是0的情况,底数是-1的情况等。所以这里还是要注意很多问题的。下面是代码,从代码中来学习:
给定一个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; }
相关文章推荐
- Android-GridView的使用
- 62. Unique Paths
- MATLAB读入视频出错的解决方法
- matlab读取xml文件
- 第四周学习进度情况
- Java集合框架:HashMap
- WCF 一步一步 发布 WCF服务 到 IIS (图)
- java中this的用法
- POJ1703 Find them, Catch them(并查集)
- Attributes的使用
- 如何用PYTHON的CGIHTTPSERVER模块模拟POST请求?
- acm 1012 大数问题
- Unicode字符集
- CodeForces 332B Maximum Absurdity
- CentOS开机简要流程
- hdu2795 Billboard 线段树单点更新区间最值
- 20159318《网络攻防技术与实践》第4周学习总结
- codeforces 652D Nested Segments 离散化+树状数组
- 数组02
- 幸福其实很简单