UVa 545 Heads

UVa 545 Heads 题目描述题目要求计算2−n2^{-n}2−n的值并以科学计数法格式输出形式为z.xxxE-y其中zzz是非零十进制数字xxx为十进制数字yyy为指数部分的绝对值。nnn的范围为1≤n≤90001 \le n \le 90001≤n≤9000。输入格式第一行一个整数rrr0r100 r 100r10表示测试用例的数量。接下来rrr行每行一个整数nnn。输出格式对于每个nnn输出一行格式为2^-n z.xxxE-y。样例输入3 8271 6000 1输出2^-8271 1.517E-2490 2^-6000 6.607E-1807 2^-1 5.000E-1题目分析本题的核心是计算2−n2^{-n}2−n并以科学计数法输出。由于nnn最大为9000900090002−n2^{-n}2−n非常小直接计算会下溢。需要使用对数方法。科学计数法表示设x2−nx 2^{-n}x2−n则log⁡10x−nlog⁡102 \log_{10} x -n \log_{10} 2log10​x−nlog10​2令dlog⁡10x−nlog⁡102d \log_{10} x -n \log_{10} 2dlog10​x−nlog10​2。将ddd分解为整数部分和小数部分d−yf d -y fd−yf其中y⌈−d⌉y \lceil -d \rceily⌈−d⌉即指数部分fdyf d yfdy为小数部分0≤f10 \le f 10≤f1。则x10d10f×10−y x 10^{d} 10^{f} \times 10^{-y}x10d10f×10−y10f10^{f}10f的值在111到101010之间将其表示为z.xxxz.xxxz.xxx的形式保留三位小数指数部分为yyy。具体计算计算d−n×log⁡102d -n \times \log_{10} 2d−n×log10​2。指数y⌈−d⌉y \lceil -d \rceily⌈−d⌉。小数部分fdyf d yfdy。有效数字v10fv 10^{f}v10f格式化为保留三位小数的浮点数。输出2^-n v E - y。复杂度分析每组数据O(1)O(1)O(1)。代码实现// Heads// UVa ID: 545// Verdict: Accepted// Submission Date: 2016-08-18// UVa Run Time: 0.000s//// 版权所有C2016邱秋。metaphysis # yeah dot net#includebits/stdc.husingnamespacestd;intmain(intargc,char*argv[]){cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);intr,n;cinr;for(inti1;ir;i){cinn;doubleexpoentlog10(2)*n;doubleroundedceil(expoent);doubledigitspow(10,rounded-expoent);cout2^-n ;coutfixedsetprecision(3)digits;coutE-(int)rounded\n;}return0;}