剑指offer:数值的整数次方
来源:互联网 发布:企业通讯录软件 编辑:程序博客网 时间:2024/05/17 07:11
题目:实现函数double pow(double base,int exp),求base的exp次方,不得使用库函数,同时不需要考虑大数问题。
要求:
1、考虑base为正数、负数、0的情况,
2、考虑exp为正数、负数、0的情况,
#include<stdio.h>double double_pow_positive(double base,int exp);int equal(double num1,double num2);double double_pow(double base,int exp){ if(double_equal(base,0)==1) { if(exp<=0)return -1; else return 0; } else { if(exp>=0)return double_pow_positive(base,exp); else return 1/double_pow_positive(base,exp); }}double double_pow_positive(double base,int exp){ if(exp==0)return 0; else if(exp<0)exp=-exp; double result=1; int i=0; for(i=1;i<=exp;++i) result*=base; return result;}int double_equal(double num1,double num2){ if(num1-num2<0.0000001&&num1-num2>-0.0000001) return 1; else return 0;}int main(){ double base=0; int exp=0; printf("请输入底数:\n"); scanf("%lf",&base); printf("请输入指数:\n"); scanf("%d",&exp); //printf("\n%f,%d\n",base,exp); printf("\n得到的结果是:%lf\n",double_pow(base,exp)); return 0;}
下面是结果的截图:
我们要考虑到特殊的情况,就是底数为0,指数为非正的情况,这时候我们返回-1,表示这样的情况下是错误的。
新颖的解法:
当然,这道题目也是有简单的解法的,就是我们对于无符号指数的时候,我们可以用这样的一个公式
n为偶数,a^n=a^(n/2)*a^(n/2)
n为奇数,a^n=a^((n-1)/2)*a^((n-1)/2)*a
这样通过递归的方法可以大大减少代码量,而且看起来比较通俗易懂。
判断是奇数或者偶数的方法是 :exp & 1 是 1 还是 0 来判断
double PowerWithUnsignedExponent(double base,unsigned int exponent){ if(exponent==0)return 1; if(exponent==1)return base; double result=PowerWithUnsignedExponent(base,exponent>>1); result*=result; if(exponent&1)result*=base; return result;}
PS:上面的程序有错,大家可以看运行的最后一张图片,应该得到1,但是运行错了,说明此时没有完全考虑边界情况,下面是改正后的程序
#include<stdio.h>int equalZero(double num1,double num2);double Power(double base,int exp){ double result=1; int i=0; if(equalZero(base,0)==1)return 0; if(exp==0)return 0; else if(exp>0) { for(i=1;i<=exp;++i) result*=base; return result; } return 1/Power(base,-exp);}int equalZero(double num1,double num2){ if(num1-num2<0.0000001&&num1-num2>-0.0000001) return 1; else return 0;}int main(){ double base=0; int exp=0; printf("请输入底数:\n"); scanf("%lf",&base); printf("请输入指数:\n"); scanf("%d",&exp); //printf("\n%f,%d\n",base,exp); if(equalZero(base,0)&&exp<=0)printf("你输入的底数或者指数不合法!\n"); else printf("\n得到的结果是:%.4lf\n",Power(base,exp)); return 0;}
0 0
- 剑指Offer之数值的整数次方
- 剑指offer:数值的整数次方
- 【剑指offer】数值的整数次方
- [剑指offer]Q11:数值的整数次方
- 【剑指offer】数值的整数次方
- 剑指Offer之数值的整数次方
- 《剑指offer》数值的整数次方
- 剑指offer--数值的整数次方
- 剑指Offer之 - 数值的整数次方
- 剑指offer-11 数值的整数次方
- 剑指offer 11 - 数值的整数次方
- 剑指Offer-数值的整数次方
- 剑指offer 数值的整数次方
- 《剑指offer》数值的整数次方
- 剑指offer—数值的整数次方
- 剑指Offer-11-数值的整数次方
- 【剑指offer】之数值的整数次方
- 剑指offer-数值的整数次方
- Xcode 升级后,常常遇到的遇到的错误解决方法
- 语法 必须遵守的 语法 推荐遵守 语法 不做要求
- 移植iperf(mips-linux)
- cocos2dx vs2010安装
- 设计模式C++实现(16)——状态模式
- 剑指offer:数值的整数次方
- C++点和箭头操作符的区别
- 重现开始战斗12-编程之美-找符合条件的整数
- Java Collection Framework
- 频繁用错误密码登录数据库,产生大量等待事件
- eclipse断点调试
- IOS创建自己的框架
- 自己动手写带有事务支持的分布式Key-Value存储系统——锁管理器
- 2014-03-26