标签:
给定一个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
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;
}
标签:
原文地址:http://blog.csdn.net/chdjj/article/details/38147341