九度OJ 1514 数值的整数次方【算法】

题目地址:http://ac.jobdu.com/problem.php?pid=1514

题目描述:

给定一个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
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
 
double PowerWithUnsignedExponent (double base, unsigned int exponent){
    if (exponent == 0)
        return 1.0;
    if (exponent == 1)
        return base;
    double ans = PowerWithUnsignedExponent (base, exponent >> 1);
    ans *= ans;
    if (exponent & 0x01 == 1){
        ans *= base;
    }
    return ans;
}
 
double Power (double base, int exponent){
    double ans;
    unsigned int uexponent;
    if ((base == 0) || (base == 0 && exponent < 0))
        return 0.0;
    uexponent = (unsigned int)abs (exponent);
    ans = PowerWithUnsignedExponent (base, uexponent);
    if (exponent < 0)
        ans = 1.0 / ans;
    return ans;
}
 
int main(void){
    int T;
    double base;
    int exponent;
    double ans;
    double zero = 0.0;
 
    while (scanf ("%d", &T) != EOF){
        while (T-- != 0){
            scanf ("%lf%d", &base, &exponent);
            ans = Power (base, exponent);
            if (ans != 0.0)
                printf ("%.2ef\n", ans);
            else if (base == 0.0 && exponent >= 0)
                printf ("%.2ef\n", zero);
            else
                printf ("INF\n");
        }
    }
 
    return 0;
}

参考资料: 何海涛 -- 程序员面试题精选100题(44)-数值的整数次方[算法]

你可能感兴趣的:(算法)