HDU 1715 大斐波数 加法高精度

解题报告:求 斐波那契数,不过这题的n的范围是1000,肯定是早就超过了的,所以要用到高精度,所以这题其实就是一个加法高精度的题。

我的做法 是写一个大数相加的函数,然后打表就是了,这里注意的就是每次做了大数相加之后任然保留倒序的数存在表里面,这样以便下次相加的时候直接加,而不用把顺序翻来翻去很麻烦,这样只要在输出的时候把顺序倒过来就可以 了。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 using namespace std;
 5 const int maxn = 1000+4;
 6 char ans[1003][1000];
 7 char* add(const char *s1,const char* s2) {
 8     int len1 = strlen(s1);
 9     int len2 = strlen(s2);
10     int a1[maxn],a2[maxn];
11     memset(a1,0,sizeof(a1));
12     memset(a2,0,sizeof(a2));
13     for(int i = 0;i<len1;++i)
14     a1[i] = s1[i]-'0';
15     for(int i= 0;i<len2;++i)
16     a2[i] = s2[i]-'0';
17     int M = max(len1,len2);
18     for(int i = 0;i<=M;++i) {
19         a1[i] += a2[i];
20         a1[i+1] += a1[i]/10;
21         a1[i] %= 10;
22     }
23     if(a1[M] != 0)
24     M++;
25     char s3[maxn]; 
26     for(int i = 0;i<M;++i)
27     s3[i] = a1[i]+'0';
28     s3[M] = NULL;
29     return s3;
30 }
31 void dabiao() {
32     ans[1][0] = ans[2][0] = '1';
33     ans[1][1] = ans[2][1] = NULL;
34     for(int i = 3;i<=1000;++i)
35     strcpy(ans[i],add(ans[i-1],ans[i-2]));
36 }
37 
38 
39 int main() {
40     int T,n;
41     dabiao();
42     scanf("%d",&T);
43     while(T--) {
44         scanf("%d",&n);
45         int len = strlen(ans[n]);
46         for(int i = len-1;i>=0;--i)
47         printf("%c",ans[n][i]);
48         puts("");
49     }
50     return 0;
51 }
View Code

 

posted @ 2013-08-13 22:52  xiaxiaosheng  阅读(313)  评论(0编辑  收藏  举报