NYOJ 461 又见Fibonacci数列

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

		}
	}
}
        



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值