博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU3117_Fibonacci_Numbers_fib前四位跟后四位
阅读量:5052 次
发布时间:2019-06-12

本文共 1500 字,大约阅读时间需要 5 分钟。

/**State: 3117    0MS    424K    1028 B    C++*题目大意:*        求出第nth个fib数,要求大于8位的只输出前4位跟后4位。*解题思路:*        后四位可以用矩阵快速幂来求,但是根据模的特性,发现原来*        周期15000fib又会回来。所以可以用数组来保存这个循环节即可。*        而前四位可以用log10.来计算,原来就是每一个数都可以用科学*        计数法来表示,我们用log10来取出每一个数科学计数法的那几个*        决定位权数的值,然后要n位就乘以10^n.不过要注意精度问题哦。*/
View Code
1 #include 
2 #include
3 using namespace std; 4 5 const int MAX = 16000; 6 int mod = 10000; 7 int fiblast[MAX] = {
0, 1, 1}, fib[MAX] = {
0, 1, 1}; 8 double N1 = (1.0 + sqrt(5.0)) / 2.0; 9 10 void pre_init()11 {12 for(int i = 3; i < MAX; i++)13 {14 fiblast[i] = (fiblast[i - 1] + fiblast[i - 2]) % mod;15 if(fiblast[i] == fiblast[1] && fiblast[i - 1] == fiblast[0])16 break;17 fib[i] = fib[i - 1] + fib[i - 2];18 }19 return ;20 }21 22 int main(void)23 {24 #ifndef ONLINE_JUDGE25 //freopen("in.txt", "r", stdin);26 #endif27 pre_init();28 int n;29 while(scanf("%d", &n) == 1)30 {31 if(n < 40)32 {33 printf("%d\n", fib[n]);34 continue;35 }36 double k = log10(1.0/sqrt(5.0)) + (double)n * log10(N1);37 //((1-sqrt(5)) / 2)^n当n==40的时候已经小数点后10位了,38 //可以忽略,本题不要求那么高的精度39 double tmp = k;40 tmp = k - (int)tmp;41 printf("%d...%0.4d\n", (int)(1000.0 * pow(10.0, tmp)), fiblast[n % 15000]);42 }43 return 0;44 }

转载于:https://www.cnblogs.com/cchun/archive/2012/08/03/2621271.html

你可能感兴趣的文章
ApplicationDelegate里的方法
查看>>
C#中给WebClient添加代理Proxy
查看>>
py 的 第 10 天
查看>>
数据结构--各种排序的实现(排序小结 希尔排序 快排 堆排序 归并排序)
查看>>
Linux MMC framework2:基本组件之core
查看>>
插入排序
查看>>
php安装扩展
查看>>
mvn dependency:tree
查看>>
伸展树——自顶向下
查看>>
查询sql server 2008所有表和行数
查看>>
SQL 中不同类型的表连接
查看>>
最小高度设置
查看>>
css3创建3D场景
查看>>
40种聚会小游戏,出去玩不会冷场了!
查看>>
Spring知识点总结
查看>>
敏捷开发方法综述
查看>>
webservice开发
查看>>
KCF追踪方法流程原理
查看>>
Quartz2D裁剪圆形头像
查看>>
vs 利用Pre-Build Event 实现简单版本号更新
查看>>