剣指OFFERの数値の整数次(九度OJ 1514)

6459 ワード

タイトルの説明:


doubleタイプの浮動小数点数baseとintタイプの整数exponentを指定します.baseのexponent次数を求めます.
 

入力:


入力には、複数のテストサンプルが含まれる場合があります.各入力ファイルについて、最初の行にはテストケースの数を表す整数Tが入力され、次のT行には浮動小数点数baseと整数exponentが入力され、2つの数の間に1つのスペースで区切られています.
 

出力:


各テストケースに対応して、浮動小数点数を出力して答えを表し、小数点数を2桁保持すればよい.
 

サンプル入力:

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 ****************************************************************/