现在的位置: 首页 > 综合 > 正文

HDU1715 大菲波数

2014年08月29日 ⁄ 综合 ⁄ 共 2195字 ⁄ 字号 评论关闭
Problem Description
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;
}

抱歉!评论已关闭.