void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

这两种办法在文章部分已经都有提及,基本思想都是大数相加,一种是字符串相加,一种是数组保存位数

第一种,字符串相加

直接用一个字符串相加函数,计算结果保存到字符串数组中

View Code
1 string operator +(const string s1,const string s2)
2 {
3 string s;
4 int l1=s1.size(),l2=s2.size(),i,j;
5 int a[1100]={0},k=0;
6 for(i=l1-1,j=l2-1;i>=0||j>=0;i--,j--,k++)
7 {
8 if(i>=0)
9 a[k]+=(s1[i]-'0');
10 if(j>=0)
11 a[k]+=(s2[j]-'0');
12 if(a[k]>9)
13 {
14 a[k+1]+=1;
15 a[k]%=10;
16 }
17 }
18 s="";
19 for(i=k;i>=0;i--)
20 {
21 if(i==k)
22 {
23 if(a[k])
24 s+=a[k]+'0';
25 }
26 else s+=a[i]+'0';
27 }
28 return s;
29 }
30
31
32  int main()
33 {
34 string a,b;
35 fib[0] = "1";
36 fib[1] = "1";
37 for(int i = 2; i < 1024; i++)
38 {
39 fib[i] = fib[i - 1] + fib[i - 2];
40 }
41 fib[0] = "0";
42 }

 第二种,用一个二维数组来保存,fb[n][i]表示第n个fib数的第i位数

View Code
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <iostream>
4 #include <string.h>
5  using namespace std;
6  int fb[6001][1003];
7  int main(void)
8 {
9 int len[6002];
10 int n;
11 memset(fb,0,sizeof(fb));
12 fb[1][0] = 1;
13 fb[2][0] = 1;
14 len[1] = 1;
15 len[2] = 1;
16 for(int i=3; i<=6000; i++)
17 {
18 memcpy(fb[i],fb[i-1],sizeof(fb[i-1]));
19 int tlen = max(len[i-1],len[i-2]);
20 for(int k=0; k<tlen; k++)
21 {
22 fb[i][k] += fb[i-2][k];
23 }
24 for(int k=0; k<tlen; k++)
25 if( fb[i][k] >= 10 )
26 {
27 fb[i][k+1]++;
28 fb[i][k] %= 10;
29 }
30 if( fb[i][tlen] != 0 )
31 tlen++;
32 len[i] = tlen;
33 }
34 while( cin >> n )
35 {
36 for(int i=len[n]-1; i>=0; i--)
37 cout << fb[n][i];
38 cout << endl;
39 }
40  return 0;
41 }
posted on 2011-05-08 15:38  void-man  阅读(1079)  评论(0编辑  收藏  举报