思路分析
前言
一道比较简单的数学题。
解法
根据题意可以推算出最大值 $v=\Big(1-\dfrac{1}{2{M+1}}\Big)\times2{2{E-1}}=A\times10B$。因为两边都比较大,所以可以同时求以 $10$ 为底的对数:$\lg v=\lg(2{M+1}-1)-(M+1)\times\lg2+(2E-1\times\lg2)=\lg A+B$。
可以遍历所有可能的 $M$,根据上述公式求出 $E$ 的值,然后再用 $E$ 和 $M$ 求出 $\lg v$ 和输入的值进行比较,如果相等,说明 $M$ 和 $E$ 就是所求的值。
敲响警钟
请注意!做两个浮点数相等判断时,二者之差的绝对值如果小于 $1^{-6}$,则认为二者相等!
代码实现
#include <cstring>
#include <cstdio>
#include <cmath>
const double EPS = 1e-6;
const double lg2 = log10(2);
int main() {
char line[256];
double A, v;
int B;
while (scanf("%s", line) == 1 && strcmp(line, "0e0")) {
*strchr(line, 'e') = ' ';
sscanf(line, "%lf%d", &A, &B);
v = log10(A) + B;
for (int M = 1; M <= 10; M++) {
int E = round(log10((v + M * lg2 - log10(pow(2, M) - 1)) / lg2 + 1) / lg2);
if (fabs(((1 << E) - 1) * lg2 + log10(pow(2, M) - 1) - M * lg2 - v) <= EPS) {
printf("%d %d\n", M - 1, E);
break;
}
}
}
return 0;
}