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