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