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;
}
posted @ 2023-09-09 16:41  群星之路  阅读(17)  评论(0)    收藏  举报