NYOJ 461 又见Fibonacci数列

本文介绍了一种高效计算大数值斐波那契数列的方法,通过数学公式简化计算过程,避免了传统递归或迭代方法带来的性能瓶颈。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=461


这个题一看貌似和以前的斐波那契数列一样 就是数据可能大些。。。于是就认为这是个大数问题。。用数组来存就行了。。于是天真的用循环 来编程序了。。代码如下。。

#include<stdio.h> #include<string.h> void f(int n) { int a,ok1[100],ok2[100],ok3[100],m; memset(ok1,0,sizeof(ok1)); memset(ok2,0,sizeof(ok2)); memset(ok3,0,sizeof(ok3)); ok2[0]=1; for(a=2;a<=n;a++) { int b,sum=0,max; for(b=0;b<=99;b++) { max=ok1[b]+ok2[b]+sum; ok3[b]=max%10; sum=max/10; } for(b=0;b<=99;b++) { ok1[b]=ok2[b]; ok2[b]=ok3[b]; } } for(m=99;;m--) { if(ok3[m]!=0) break; } for(a=m;a>m-4;a--) { if(a<0) break; printf("%d",ok3[a]); } printf("\n"); } int main() { int a,b,n,m; while(scanf("%d",&n)!=EOF) { if(n==0||n==1) printf("%d\n",n); else f(n); } }

编了这么长的程序交上去一看。。悲剧了。。超时了哈。。。想了n久,还是不知道怎么处理,,于是就去百度了一下。。发现。。。于是重新写代码。好吧。。不扯了,ac代码如下::

#include<stdio.h> #include<math.h> int main() { int n,m; int yi[]={0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765}; while(scanf("%d",&n)!=EOF) { double sum,a=-0.5*log(5)/log(10),b=log( ( 1+sqrt(5.0) )/2 )/log(10); if(n<=20) printf("%d\n",yi[n]); else { double sum; sum=a+n*b; sum=sum-int(sum); sum=pow(10,sum); while(sum<1000) sum=sum*10; printf("%d\n",int(sum)); } } }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值