UVA11809 题解

发布时间 2023-09-09 16:47:29作者: 群星之路

思路分析

前言

一道比较简单的数学题

解法

根据题意可以推算出最大值 $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;
}