杭电1715

题目描述:

Fibonacci数列,定义如下:
f(1)=f(2)=1
f(n)=f(n-1)+f(n-2) n>=3。
计算第n项Fibonacci数值。

用斐波那契数列的通项计算一下,(((1+sqrt(5))/2)^1000-((1-sqrt(5))/2)^1000)/sqrt(5)=4.3*10^208,数据很大,不是一般的数据类型可以存储下的,所以考虑大数计算,用a[1005][300]来存放数列,a[i]表示第i+1个数,AC代码:

#include<stdio.h>
int a[1005][300]={0};
int b[1005];
int main(){
	a[0][0]=1;
	a[1][0]=1;
	b[0]=1;b[1]=1;
	for(int i=2;i<1000;i++){
		int n=b[i-2],m=b[i-1],flag=0,j;
		for(j=0;j<n;j++){
			int t=a[i-2][j]+a[i-1][j]+flag;
			if(t>9){
				flag=1;
				a[i][j]=t-10;
			}
			else {a[i][j]=t;flag=0;}
		}
		for(;j<m;j++){
			int t=a[i-1][j]+flag;
			if(t>9){
				flag=1;
				a[i][j]=t-10;
			}
			else {a[i][j]=t;flag=0;}
		}
		if(flag==1) a[i][m++]=1;
		b[i]=m;
	}
	int T;
	scanf("%d",&T);
	while(T--){
		int k,q;
		scanf("%d",&k);
		for(q=299;q>=0;q--){
			if(a[k-1][q]!=0) break;
		}
		for(;q>=0;q--)
			printf("%d",a[k-1][q]);
		printf("\n");
	}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值