UVA11809 题解
思路分析
前言
一道比较简单的数学题。
解法
根据题意可以推算出最大值 \(v=\Big(1-\dfrac{1}{2^{M+1}}\Big)\times2^{2^{E-1}}=A\times10^B\)。因为两边都比较大,所以可以同时求以 \(10\) 为底的对数:\(\lg v=\lg(2^{M+1}-1)-(M+1)\times\lg2+(2^E-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;
}
浙公网安备 33010602011771号