大斐波数(大数加法)

Fibonacci数列,定义如下:
f(1)=f(2)=1
f(n)=f(n-1)+f(n-2) n>=3。
计算第n项Fibonacci数值。
Input
输入第一行为一个整数N,接下来N行为整数Pi(1<=Pi<=1000)。
Output
输出为N行,每行为对应的f(Pi)。
Sample Input
5
1
2
3
4
5
Sample Output
1
1
2
3
5

其实就是模拟加法。数据太大要先打表。另外第1000项有300多位。。。
以下是AC代码

#include <iostream>
#include <cstring>
using namespace std;

char ans[1002][350], tmp1[350], tmp2[350];

void add(char *a, char *b, char *c)	//默认a > b 
{
	int lenA = strlen(a), lenB = strlen(b), len = lenA - lenB, t = 0, i;
	for(i = lenB-1;i >= 0;i--)
	{
		b[i+len] = b[i];
	}
	for(i = 0;i < len;i++) b[i] = '0';
	c[0] = '0';
	for(i = lenA-1;i >= 0;i--)
	{
		c[t++] += a[i] + b[i] - 2*'0';
		if(c[t-1]-'0' >= 10)
		{
			c[t-1] -= 10;
			c[t] = '1';
		}
		else c[t] = '0';
	}
	if(c[t] > '0') c[t+1] = '\0';
	else c[t] = '\0';
}

int main()
{
	int n, x, i;
	strcpy(ans[1], "1"), strcpy(ans[2], "1");
	
	for(i = 3;i <= 1000;i++)		//打表 
	{
		strcpy(tmp1, ans[i-1]);
		strcpy(tmp2, ans[i-2]);
		add(tmp1, tmp2, ans[i]);
		strrev(ans[i]);				//反转 
	}
	cin>>n;
	while(n--)
	{
		cin>>x;
		cout<<ans[x]<<endl; 
	}
	return 0;	
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值