首页 > 代码库 > 【剑指offer】数值的整数次方
【剑指offer】数值的整数次方
- 题目描述:
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
- 输入:
输入可能包含多个测试样例。
对于每个输入文件,第一行输入一个整数T,表示测试案例的数目,接下来的T行每行输入一个浮点数base和一个整数exponent,两个数中间用一个空格隔开。
- 输出:
对应每个测试案例,
输出一个浮点数代表答案,保留两位小数即可。
- 样例输入:
5 1.0 10 0.0 -5 1.0 0 1.2 5 2.0 -1
- 样例输出:
1.00e+00f INF 1.00e+00f 2.49e+00f 5.00e-01f
要点:1.由于计算机表示小数(包括浮点和double)都与误差,我们不能直接用等号判断两个小数是否相等,如果两个小数的差的绝对值很小,比如小于0.0000001,就可以认为他们相等。2.本题还需考虑底数为0,指数为负数的情况。3.递归解法较新颖。原理是:
实现:
/* 数值的整数次方 by Rowandjj 2014/7/26 */ #include<stdio.h> #include<math.h> bool g_invalid_input = false; //方案1 double PowerWithUnsignedExponent1(double base,unsigned int exponent) { double result = 1.0; unsigned int i; for(i = 0; i < exponent; i++) { result *= base; } return result; } //方案2---->递归 double PowerWithUnsignedExponent2(double base,unsigned int exponent) { if(exponent == 0) { return 1; } if(exponent == 1) { return base; } double result = PowerWithUnsignedExponent2(base,exponent>>1); result *= result; if(exponent & 0x1 == 1)//exponent%2==1,为奇数 { result *= base; } return result; } //base^exponent double Power(double base,int exponent) { g_invalid_input = false; //底数为0,指数为负数 if(fabs(base - 0.0)<0.0000001 && exponent < 0) { g_invalid_input = true; return 0.0; } unsigned int absExponent = (unsigned int)(exponent); if(exponent < 0) { absExponent = (unsigned int)(-exponent); } double result = PowerWithUnsignedExponent2(base,absExponent); if(exponent < 0) { result = 1.0/result; } return result; } int main() { int n,exp; double base; while(scanf("%d",&n) != EOF) { int i; for(i = 0; i < n; i++) { g_invalid_input = false; scanf("%lf %d",&base,&exp); double result = Power(base,exp); if(!g_invalid_input) printf("%.2ef\n",result); else printf("INF\n"); } } return 0; }
【剑指offer】数值的整数次方
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。