算法:数值的整数次方
2016-05-11 15:02
369 查看
看到这个题目,自以为挺简单的,考察的是我们的细心程度,要思考全面,考虑到数值为0,指数为小数的情况,
具体代码如下:
在这个代码中,当判断底数是否为0时,不可以直接用==判断,因为计算机内表示小数(float和double类型)时是存在误差的,判断两个小数相等,我们可以判断两个数差的绝对值是不是在一个很小的范围内即可。
还有一种更高效的方法,用右移运算符代替除以2,用位与运算代替求余运算符,效率比乘除法高。代码如下:
具体代码如下:
//数值的整数次方 不得调用库函数 #include<stdio.h> //解法一: double power(double base,unsigned int exponent) { double result=1.0; int i; for(i=1;i<=exponent;i++) result *= base; return result; } int equals(double num1,double num2) { if((num1-num2>-0.0000001)&&(num1-num2<0.0000001)) return 1; else return 0; } double exp(double base,int exponent) { int s; double result; unsigned int absexponent; s=equals(base,0.0); //判断底数base是否为0,因为是double类型,在计算机内表示小数都有误差 if( s==1 && exponent<0) //当base=0且指数小于0的情况,防止对0求倒数的情况 return 0.0; absexponent= (unsigned int)(exponent); if(exponent<0) //指数为小数的情况 absexponent=(unsigned int)(-exponent); result=power(base,absexponent); if(exponent<0) result=1.0/result; return result; if(exponent>0) { result=power(base,exponent); return result; } } int main() { double base,result; int exponent; scanf("%lf,%d",&base,&exponent); result=exp(base,exponent); printf("%lf\n",result); return 0; }
在这个代码中,当判断底数是否为0时,不可以直接用==判断,因为计算机内表示小数(float和double类型)时是存在误差的,判断两个小数相等,我们可以判断两个数差的绝对值是不是在一个很小的范围内即可。
还有一种更高效的方法,用右移运算符代替除以2,用位与运算代替求余运算符,效率比乘除法高。代码如下:
double exp(double base,int exponent) { double result; if(exponent==0) return 1; if(exponent==1) return base; result=exp(base,exponent>>1); //用右移代替除以2,提高效率 result*=result; if(exponent& 0x1 ==1) //用位运算中的与运算代替求余来判断指数为奇数还是偶数 result *= base; return result; } 这种方法是比如我们求一个数的32次方,已经知道了他的16次方,只要在16次方的基础上平方即可, 而16次方有可以在8次方的基础上平方,以此类推,
相关文章推荐
- 0.0.0.0/0是什么意思
- 结构体定义 typedef struct 用法详解和用法小结
- apache commons io 依赖信息
- Java获取随机数的3种方法
- kuryr环境搭建
- 把命令结果输出到以时间为文件名的文件中
- C++与Java的区别
- WebView 无法加载html上传文件的控件
- java 对象流、管道流、基本数据流、字节数组流
- boost circular_buff 测试
- iOS开发之基础视图——UILabel
- Android强制设置横屏或竖屏
- 深入浅出RxJava——基础篇
- POJ 1164 The Castle 并查集做法
- kali linux Python开发环境初始化
- 关于okhttp和retrofit的使用的疑问
- 数据结构-C语言递归实现树的前中后序遍历
- Android 消息传递机制分析
- 开始把积攒下来的技术文章写完
- Java Socket 实现HTTP与HTTPS协议发送POST/GET请求