算法:数值的整数次方
来源:互联网 发布:淘宝店什么产品好卖 编辑:程序博客网 时间:2024/06/05 18:00
看到这个题目,自以为挺简单的,考察的是我们的细心程度,要思考全面,考虑到数值为0,指数为小数的情况,
具体代码如下:
//数值的整数次方 不得调用库函数#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
- 算法:数值的整数次方
- 【算法详解】求解数值的整数次方
- 数值的整数次方(算法)
- 算法题20 数值的整数次方
- 算法题目---数值的整数次方
- 【算法】求数值的整数次方
- 算法题/数值的整数次方
- 数值的整数次方
- 数值的整数次方
- 数值的整数次方
- 数值的整数次方
- 数值的整数次方
- 数值的整数次方
- 数值的整数次方
- 数值的整数次方
- 数值的整数次方
- 数值的整数次方
- 数值的整数次方
- 美团机器学习InAction系列—实例详解机器学习如何解决问题
- Spring Boot 定时任务的使用
- 【转帖】记住效率是做好测试工作的灵魂
- Ubuntu 将两个文件合并为一个文件
- PHP中的数据类型
- 算法:数值的整数次方
- Spring boot单元测试-service层
- SQL PLUS命令使用大全
- c基础巩固 1:1,2,3,4无重复三位排序
- 如何添加全局过滤器
- Eclipse在线安装SVN
- Android listview、gridView 只显示一行
- poj 2506 Tiling && nyoj 429 骨牌铺方格
- maven配置本地中心仓库位置