根据题意,可以推断出最大值
又因为数字的数值过大,所以可以同时求以10为底的对数,即:
根据题目要求
所以可以根据式子
先求出对应的lgv的值,然后根据式子
可以推出
对M由0到9进行遍历,并求出对应的E值(取整数),计算出对应的lgv值与前面的lgv进行比较,若差值较小(取1e-4)则输出对应的M和E,代码如下
#include <iostream>
#include <cmath>
#include <string>
using namespace std;
const double eps = 1e-4;
int main() {
string line;
double lg2 = log10(2), A, lgv;
int B;
while (cin >> line && line != "0e0") {
line[line.find('e')] = ' ';
sscanf(line.c_str(), "%lf%d", &A, &B);
lgv = log10(A) + B;
for (int M = 0; M < 10; M++) {
int E = floor(log10((lgv - log10(pow(2,M+1) - 1) + (M+1)*lg2) / lg2 + 1) / lg2 + 0.5);
if (fabs(((1<<E)-1)*lg2 - (M+1)*lg2 + log10(pow(2,M+1)-1) - lgv) < eps) {
printf("%d %d\n", M, E);
break;
}
}
}
return 0;
}