哈理工oj 1266 斐波那契数列

来源:互联网 发布:阮一峰javascript历史 编辑:程序博客网 时间:2024/06/05 09:13

斐波那契数列Time Limit: 1000 MSMemory Limit: 65536 KTotal Submit: 1448(401 users)Total Accepted: 414(337 users)Rating: Special Judge: NoDescription

定义:后一个数等于前两个数之和的数列。

要求:已知出三个正整数n、m、k(0<=n、m<=10,1<=k<=89),计算出以n、m开头的斐波那契数列中第k个数的大小。



Input

输入包含多组测试用例。

每组测试用例要求输入三个整数n、m、k。



Output对于每组测试用例,输出一个整数作为结果。

Sample Input0 1 2

Sample Output1

Source2012 Winter Holiday Contest 4 - Water BattleAuthor卢俊达

这道题很明显是道基础题,只要把存储的数组的数据类型变为 unsigned long long,就行了,但是为什么不能改为double呢,这就是我写这篇博客的原因,因为数据过大,如果用double的话,那么必然会导致精度缺失,为什么呢,原因如下:

1,因为double类型是浮点数,这种类型可以用科学记数法表示,所以表示范围非常大。
但是,使用可浮点数的代价就是损失了精度。它把这部分精度用于指数的表示。
所以double类型的优点就是数据范围大,缺点是精度不足,大概只有15~16位有效位数。

2,它表示大数的代价就是损失了精度。举个例子:假设我有0-9这10个数,我定义数n表示5n,那么这10个数最大能表示5*9=45。
能表示的范围是:0、5、10、15、20、25、30、35、40、45。最小值为0,最大值为45。所以表示的范围是:0~45。
但1、2、3、4,......,41,42,43,44这些不是5的倍数的数就没法精确表示了,只能在定义中把它们靠向0、5、......、40或者45。
这就是为了扩大表示范围而损失了表示精度。

Oracle NUMBER类型的最大字符个数是38
所以,Oracle NUMBER能表示的最大整数为:a = 99999999999999999999999999999999999999(38个9)
如果转换成DOUBLE,会丢失精度,用DOUBLE存储以后,实际的结果为:b = 1E38 即 10^38 = 100000000000000000000000000000000000000

显然:a ≈ b
但b不是我们期待的值,除非实际应用场景能够认可。
所有Oracle NUMBER不能简单的转为DOUBLE存储,会丢失精度。

转自:

http://m.blog.csdn.net/sunny05296/article/details/69337705