剑指OFFER之数值的整数次方(九度OJ1514)

题目描述:

给定一个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

解题思路:

  这道题看似简单,其实BUG重重。要注意的问题:

  1 输入double类型的时候要用%lf

  2 关于次幂的问题特殊的情况,比如次幂为负数,或者基数为0时等等复杂的情况

  3 机器中浮点数的比较是由误差的,因此double类型的比较,不能用简单的a==0来比较。一般的比较方式是,相减的差在一个很小的区间内,我们就认为是相等的。方法如下:

(float1- float2 > -0.0000001) && (float1 -float2 < 0.0000001)

  4 机器输出的格式:

  

%e用于输出 3.071e+002这种格式的



%.2e 用于输出3.07e+002



%.2ef用于输出3.07e+002f

  这样,基本的问题就都解决了。

代码:

#include <stdio.h>

double test(double b,int e);

int flag=0;

int main(void){

    int n,exp;

    double base;

    while(scanf("%d",&n) != EOF && n>=0){

        while(n--){

            flag = 0;

            scanf("%lf %d",&base,&exp);

            double result = test(base,exp);

            if(!result && flag)

                printf("INF\n");

            else

                printf("%.2ef\n",result);

        }

    }

}

double test(double b,int e){

    double base = b;

    if(e<0){

        e = -e;

        flag = 1;

    }

    if(e == 0)

        return 1;

    while(--e)

            b *= base;

    if(flag){

        if((base - 0.0 > -0.0000001) && (base -0.0 < 0.0000001))

            return 0;

        return 1.0/b;

    }

    else

        return b;

}

/**************************************************************

    Problem: 1514

    User: xhalo

    Language: C

    Result: Accepted

    Time:80 ms

    Memory:912 kb

****************************************************************/

 

你可能感兴趣的:(FF)