• 剑指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
    ");
                else
                    printf("%.2ef
    ",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
    ****************************************************************/
  • 相关阅读:
    Asp.net开发必备51种代码
    防止页面被多次提交
    c#发送邮件.net1.1和.net2.0中的两个方法
    鼠标移至小图,自动显示相应大图
    NET(C#)连接各类数据库集锦
    在C#中对XML的操作
    Window.ShowModalDialog使用总结
    SQLServer2005 添加用户,及操作权限
    定时器
    Global.asax.cs中的方法的含义
  • 原文地址:https://www.cnblogs.com/xing901022/p/3751502.html
Copyright © 2020-2023  润新知