UVa 474 Heads Tails Probability
题目描述
题目要求计算 2−n2^{-n}2−n 的值,并以科学计数法格式输出,形式为 z.xxx e - y,其中 zzz 是非零十进制数字,xxx 为十进制数字,yyy 为整数(无前导零或空格)。nnn 的范围为 111 到 100000100000100000。
输入格式
输入包含多个 nnn 值,每行一个。输入以文件结束符(EOF\texttt{EOF}EOF)终止。
输出格式
对于每个 nnn,输出一行,格式为:
2^-n = z.xxx e - y
其中 z.xxxz.xxxz.xxx 为保留三位小数的浮点数,yyy 为指数部分的绝对值。
样例
输入
1
100
10000
100000
输出
2^-1 = 5.000e-1
2^-100 = 7.889e-31
2^-10000 = 5.012e-3011
2^-100000 = 1.010e-301030
题目分析
本题的核心是计算 2−n2^{-n}2−n 并以科学计数法输出。由于 nnn 最大为 100000100000100000,2−n2^{-n}2−n 非常小,直接计算浮点数会下溢。需要使用对数方法。
科学计数法表示
设 x=2−nx = 2^{-n}x=2−n,则:
log10x=−nlog102 \log_{10} x = -n \log_{10} 2 log10x=−nlog102
令 d=log10x=−nlog102d = \log_{10} x = -n \log_{10} 2d=log10x=−nlog102。将 ddd 分解为整数部分和小数部分:
d=−y+f d = -y + f d=−y+f
其中 y=⌈−d⌉y = \lceil -d \rceily=⌈−d⌉(即指数部分),f=d+yf = d + yf=d+y 为小数部分(0≤f<10 \le f < 10≤f<1)。则:
x=10d=10f×10−y x = 10^{d} = 10^{f} \times 10^{-y} x=10d=10f×10−y
10f10^{f}10f 的值在 111 到 101010 之间,将其表示为 z.xxxz.xxxz.xxx 的形式(保留三位小数),指数部分为 yyy。
具体计算
- 计算 d=−n×log102d = -n \times \log_{10} 2d=−n×log102。
- 指数 y=⌈−d⌉y = \lceil -d \rceily=⌈−d⌉(注意 ddd 为负数)。
- 小数部分 f=d+yf = d + yf=d+y(0≤f<10 \le f < 10≤f<1)。
- 有效数字 v=10fv = 10^{f}v=10f,格式化为保留三位小数的浮点数。
- 输出
2^-n = v e - y。
精度处理
由于浮点数计算可能有微小误差,需要对 yyy 进行修正(例如当 vvv 接近 101010 时,应调整指数)。参考代码中对 n=6n=6n=6 做了特殊处理,这是因为浮点误差导致结果偏差。更通用的方法是使用高精度计算或调整取整方式。
复杂度分析
每组数据只需常数时间计算。
代码实现
// Heads / Tails Probability
// UVa ID: 474
// Verdict: Accepted
// Submission Date: 2016-07-17
// UVa Run Time: 0.000s
//
// 版权所有(C)2016,邱秋。metaphysis # yeah dot net
#include <bits/stdc++.h>
using namespace std;
int main(int argc, char *argv[])
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
int n;
while (cin >> n)
{
double expoent = log10(2) * n;
double rounded = ceil(expoent);
double digits = pow(10, rounded - expoent);
// bug, need to fix
if (n == 6)
{
cout << "2^-6 = 1.562e-2\n";
continue;
}
cout << "2^-" << n << " = ";
cout << fixed << setprecision(3) << digits;
cout << "e-" << (int)rounded << '\n';
}
return 0;
}
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)