uva11809floating-point numbers浮点数
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=93800#problem/L
题意:输入表示尾数位数为M阶码尾数为E的最大浮点数AeB的A和B,输出M和E。
思路:M的范围为0到9,E的范围为1到30,打表储存其对应的A和B:尾数表示的数m=1-2^(-1-M),阶码表示的数e=2^j-1。m*2^e=AeB,2边同时取10的对数得到log10(m)+e*log(10)2=log10(A)+B=t,因为0<A<10,所以t的整数部分为B,小数部分为log10(A)。在表中找A时,其精度为1e-4。
#include<iostream> #include<math.h> #include<string.h> #include<sstream> using namespace std; int main() { double A[10][31]; int B[10][31]; for(int i=0;i<=9;i++) for(int j=1;j<=30;j++) { double m=1-pow(2,-1-i); int e=pow(2,j)-1; double t=log10(m)+e*log10(2); B[i][j]=t; A[i][j]=pow(10,t-B[i][j]); } string c; while(cin>>c&&c!="0e0") { for(string::iterator p=c.begin();p!=c.end();p++) if(*p=='e')*p=' '; stringstream ss(c); double a; int b; ss>>a>>b; for(int i=0;i<=9;i++) for(int j=1;j<=30;j++) { if(B[i][j]==b&&(fabs(A[i][j]-a)<1e-4||fabs(a/10-A[i][j])<1e-4)) { cout<<i<<" "<<j<<endl; break; } } } return 0; }