原题链接: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)); } } }