大数斐波那契数列的求法(大数相加)

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

第一种,字符串相加

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

ContractedBlock.gif ExpandedBlockStart.gif 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位数

ContractedBlock.gif ExpandedBlockStart.gif 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 }

转载于:https://www.cnblogs.com/void/archive/2011/05/08/2040388.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值