Problem Description
Fibonacci数列,定义如下:
f(1)=f(2)=1
f(n)=f(n-1)+f(n-2) n>=3。
计算第n项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)。
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
#define MAXN 9999
#define MAXSIZE 100
#define DLEN 4
class BigNum{
private:
int num[500];
int len;
public:
BigNum(){len=1;memset(num,0,sizeof(num));}
BigNum(const int a){
int c,d=a;
len=0;
memset(num,0,sizeof(num));
while(d>MAXN){
c=d-(d/(MAXN+1))*(MAXN+1);
d=d/(MAXN+1);
num[len++]=c;
}
num[len++]=d;
}
BigNum(const char *s){
memset(num,0,sizeof(num));
int l=strlen(s);
len=l/DLEN;
if(l%DLEN)len++;
int index=0;
for(int i=l-1;i>=0;i-=DLEN){
int t=0;
int k=i-DLEN+1;
for(int j=k;j<=i;j++)
t=t*10+s[j]-'0';
num[index++]=t;
}
}
BigNum(const BigNum &T):len(T.len){
memset(num,0,sizeof(num));
for(int i=0;i<len;i++)
num[i]=T.num[i];
}
BigNum &operator =(const BigNum &n){
len=n.len;
for(int i=0;i<len;i++)
num[i]=n.num[i];
return *this;
}
bool operator >(const BigNum &T){
if(len>T.len)return true;
else if(len==T.len){
int ln=len-1;
while(num[ln]==T.num[ln]&&ln>=0)ln--;
if(ln>=0&&num[ln]>T.num[ln])return true;
else return false;
}
else return false;
}
bool operator >(const int &t){
BigNum b(t);
return *this>b;
}
BigNum operator +(const BigNum & T){
BigNum t(*this);
int big=T.len>len?T.len:len;
for(int i=0;i<big;i++)
{
t.num[i]+=T.num[i];
if(t.num[i]>MAXN){
t.num[i+1]++;
t.num[i]-=MAXN+1;
}
}
if(t.num[big]!=0)
t.len=big+1;
else t.len=big;
return t;
}
BigNum operator -(const BigNum &T){
bool flag;
BigNum t1,t2;
if(*this>T){
t1=*this;
t2=T;
flag=0;
}
else{
t1=T;
t2=*this;
flag=1;
}
int big=t1.len;
for(int i=0;i<big;i++){
if(t1.num[i]<t2.num[i]){
int j=i+1;
while(t1.num[j]==0)j++;
t1.num[j--]--;
while(j>i)
t1.num[j--]+=MAXN;
t1.num[i]+=MAXN+1-t2.num[i];
}
else t1.num[i]-=t2.num[i];
}
t1.len=big;
while(t1.num[len-1]==0&&t1.len>1){
t1.len--;
big--;
}
if(flag)
t1.num[big-1]=0-t1.num[big-1];
return t1;
}
void print(){
cout<<num[len-1];
for(int i=len-2;i>=0;i--){
cout.width(DLEN);
cout.fill('0');
cout<<num[i];
}
cout<<endl;
}
};
int main()
{
freopen("C:\\in.txt","r",stdin);
int N;
scanf("%d",&N);
for(int i=1;i<=N;i++){
int num;
scanf("%d",&num);
BigNum t1(1);
//t1.print();
BigNum t2(t1);
//t2.print();
BigNum t3=t1+t2;
//t3.print();
if(num==1){t1.print();continue;}
if(num==2){t2.print();continue;}
for(int i=3;i<=num;i++){
t3=t1+t2;
t1=t2;
t2=t3;
}
t3.print();
}
return 0;
}