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

时间:2022-04-22
本文章向大家介绍剑指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("INFn");
            else
                printf("%.2efn",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
****************************************************************/