现在的位置: 首页 > 综合 > 正文

幂 结题报告

2013年10月02日 ⁄ 综合 ⁄ 共 1337字 ⁄ 字号 评论关闭

题目来源:http://acm.nyist.net/JudgeOnline/problem.php?pid=633

题目描述:

描述
在学习循环的时候,我们都练习过利用循环计算a的k次方。现在给定整数k和一个整数m,请你求出对应的整数a,使得a的k次方是不超过m并且最接近m的数值。 

输入
一个整数T表示测试组数。
对于每组测试数据:
给定两个整数k和m 

数据范围:
1 <= T <= 20
1 <= k <= 10^9
0 <= a <= 10^9
0 <= M <= 10^100

输出
对于每组数据,输出一个整数a占一行。
样例输入
2
2 4
3 27 
样例输出
2
3 
刚开始看了这道题觉得有点像大数运算、但是感觉如果模拟幂次方有点不靠谱。
后来想到了对数运算、可是又发现数据太大、根本无法计算。
然后百度了一下,看到了人家的代码。
这是原文链接:http://www.cnblogs.com/yaling/archive/2013/05/16/3082463.html
才想起double型在存储大数据时会截断低位的数据,所以数据的精度会降低,但是在这题上面如果数据越大,
m要求的的精度就越小。如果考虑到非常极端的数据、估计这个题也很难解了。不过这样子做也能AC了。
下面再复习一下double型的IEEE标准:

双精度浮点数(double)是计算机使用的一种数据类型。比起单精度浮点数(float)双精度浮点数(double)使用
64 位(8字节) 来存储一个浮点数。 它可以表示十进制的15或16位有效数字,其可以表示的数字的绝对值范围大约是
[ 1.7 \times 10^{-308} , \text{1.7} \times 10^{308} ]

格式[编辑]

sign bit(符号): 用来表示正负号

exponent(指数): 用来表示次方数

mantissa(尾数): 用来表示精确度

General double precision float.png

符号

0代表数值为正,1代表数值为负。

指数

类比整型使用所有位为0的数字表示数值“0”,双精度浮点数表示0时指数部分也为0。若如此,便可能产生冲突:比如全0的数字可能表示“0”,也可能表示\text{1} \times \text{2}^{0} \text{= 1}(参考下文“尾数”的解释)。于是此处规定,指数使用0x3ff(十进制1023)的偏移量,便有以下规则:

  • 0x000:用来代表0(mantissa=0)或下溢数(mantissa不为0)。
  • 0x7ff:用来代表无穷大(mantissa=0)或NaN(mantissa不为0)。
  • 其他:代表2的(exponent-0x3ff)次方。

尾数[编辑]

在二进制的“科学记号”,数字被表示为:

\text{Mantissa} \times \text{2}^\text{exponent}

为了最大限度提高精确度,可以要求尾数规格化,把尾数处理到大于等于1而小于2的区间内,便可省去前导的“1”。例如:

 二进制的  \text{11.101} \times \text{2}^\text{1001} 可以规格化为 \text{1.1101} \times \text{2}^\text{1010},存储时尾数只需要存储1101即可
 二进制的  \text{0.00110011} \times \text{2}^\text{-1100} 可以规格化为 \text{1.10011} \times \text{2}^\text{-1001},存储时尾数只需要存储10011即可

于是,可得以下形式:\text{1.mantissa} \times \text{2}^\text{exponent}

小结[编辑]

根据以上的叙述,一个双精度浮点数所代表的数值为: (-1)^{\text{sign}} \times 2^{\text{exponent} - \text{0x3ff}} \times 1.\text{mantissa}

例子[编辑]

 3ff0 0000 0000 0000   = 1
 c000 0000 0000 0000   = -2
 7fef ffff ffff ffff   ~ 1.7976931348623157 x 10308 (Max Double)
 3fd5 5555 5555 5555   ~ 1/3
 0000 0000 0000 0000   = 0
 8000 0000 0000 0000   = -0
 7ff0 0000 0000 0000   = 無限大
 fff0 0000 0000 0000   = 負無限大

代码不贴了、不是我自己写的。

抱歉!评论已关闭.