uva495
题目概述:
从fabonacci序列中分离出来的一个问题。要求输入一个数字n(n<5001),输出这个数列中第n个数字,输入0结束。其实要我们做的是一个大数相加问题。这个程序的关键不只是这点,还要注意节省内存,所以我推荐使用字符串(string类型)记录所得的数据。
样例输入输出:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio>
2 #include<cstring>
3 #include<iostream>
4 #include<string>
5 using namespace std;
6 class fibonacci
7 {
8 private:
9 string *data;
10 int length[5010];
11 public:
12 fibonacci();
13 void print(int num=0);
14 friend string add(string &a,string &b,int num1,int num2,int &length);
15 void count();
16 ~fibonacci();
17 };
18 fibonacci::fibonacci()
19 {
20 memset(length,0,sizeof(length));
21 data=new string[5010];
22 for(int i=0;i<5010;i++)
23 data[i].assign(2000,'0');
24 }
25 fibonacci::~fibonacci()
26 {
27 delete[] data;
28 }
29 void fibonacci::print(int num)
30 {
31 for(int i=length[num];i>=0;i--)
32 cout<<data[num][i];
33 cout<<endl;
34 }
35 void fibonacci::count()
36 {
37 data[1][0]='1';
38 data[2][0]='1';
39 for(int i=3;i<5010;i++)
40 data[i]=add(data[i-1],data[i-2],length[i-1],length[i-2],length[i]);
41 return ;
42 }
43 string add(string &a,string &b,int num1,int num2,int &length)
44 {
45 int leng=(num1>num2)?num1: num2;
46 leng++;
47 int tem=0,next=0;
48 string temp;
49 temp.assign(2000,'0');
50 for(int i=0;i<=leng;i++)
51 {
52 next=tem+a[i]+b[i]-'0'-'0';
53 tem=next/10;
54 temp[i]=char((next%10) +'0');
55 }
56 length=leng-1;
57 if(temp[leng]!='0')
58 length=leng;
59 return temp;
60 }
61 int main()
62 {
63 fibonacci test;
64 test.count();
65 int trial=0;
66 while(cin>>trial)
67 {
68 cout<<"The Fibonacci number for "<<trial<<" is ";
69 test.print(trial);
70 }
71 system("pause");
72 return 0;
73 }
74