void-man

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

大数的斐波那契数列,目前处理大数还不算顺手还要多练,大数的处理有多种办法

一种是用字符串转换成整数一位一位的加,然后在转换成字符串返回,还有一种是用整形数组,根据题目的不同要求选择合适方法,比如这道题

斐波那契数列,给出的是n,让你求第n项,我们可以用二维数组,fb[n][k]的值就是第n项第k位的数是多少

这里可以直接用memcpy()函数,算的时候可以直接把后一项叠加到前一项上面,这样就不用计算时候用两项相加了

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,i,j;
11 memset(fb,0,sizeof(fb));
12 fb[1][0]=1;fb[2][0]=1;
13 len[1]=1;len[2]=1;
14 for(i=3;i<=6000;i++)
15 {
16 memcpy(fb[i],fb[i-1],sizeof(fb[i-1])); //直接把第一项的值赋值到当前所求项上
17   for(j=0;j<len[i-2];j++)
18 fb[i][j]+=fb[i-2][j];
19 for(j=0;j<max(len[i-1],len[i-2]);j++)
20 {
21 if(fb[i][j]>9)fb[i][j+1]+=fb[i][j]/10;
22 fb[i][j]%=10;
23 }
24 if(fb[i][j]!=0)j++;
25 len[i]=j;
26 }
27 while(cin>>n)
28 {
29 for(int k=len[n]-1;k>=0;k--)
30 cout<<fb[n][k];
31 cout<<endl;
32
33 }
34 return 0;
35 }
posted on 2011-05-08 15:19  void-man  阅读(802)  评论(0编辑  收藏  举报