题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=103453#problem/J
题目大意:给出一个浮点数,其值为(1-2^-M)^(2^E),求M和E的值。
题目分析:由于E范围为30,所以用对数判断,写出求M和E的数学表达式即可。
网上题解多用打表,比较容易。
注意要点:1.浮点数不能直接读入,因为指数过大存不了 2.精度问题挖了五六次,C/C++中无直接以2为底的函数,用换底公式,但是lg2由于精度问题比实际数值小
AC代码:
#include<stdio.h>
#include<cstring>
#include<string>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
int main()
{
int n; char c; long double x; string s;
cin >> n >> c >> s;
x=n;
while(x!=0)
{
long double p,q; int k,m,l,i={0};
while (s[i]>='0' && s[i]<='9'){
x=x+(s[i]-'0')*pow(0.1,i+1);
i++;
}
n=0; i++;
while (s[i]>='0' && s[i]<='9'){
n=n*10+s[i]-'0';
i++;
}
p=(log10(x)+n)/log10(2);
k=int(p+1e-8)+1;
q=(1-pow(2,p-k));
m=int(abs(log10(q)/log10(2))-1e-8);
cout << m << " " << int(log10(k+1)/log10(2)+1e-8) << endl;
cin >> n >> c >> s;
x=n;
}
}