poj 2506-递推+高精度

刚开始一直re,高精度的时候要注意,f[n]=f[n-1]+2*f[n-2];数组要开到350才够

View Code
 1 #include<stdio.h>
 2 #include<string.h>
 3 #define max(x,y) x>y?x:y
 4 char s[350][105]={"1","1"};
 5 int t1[105];
 6 void add(int n1,int n2)
 7 {
 8     int len1=strlen(s[n1]);
 9     int len2=strlen(s[n2]);
10     int lenmax=max(len1,len2);
11     t1[0]=0;
12     t1[1]=0;
13     int i,j,k;
14     lenmax++;
15     for(i=len1-1,j=len2-1,k=lenmax;i>=0&&j>=0;i--,j--,k--)
16     t1[k]=s[n1][i]-'0'+2*(s[n2][j]-'0');
17     if(j<0)
18     {
19         while(i>=0)
20         {
21             t1[k]=s[n1][i]-'0';
22             i--;
23             k--;
24         }
25     }
26     for(k=lenmax;k>=1;k--)
27     {
28         t1[k-1]+=(t1[k]/10);
29         t1[k]%=10;
30     }
31     if(t1[0])
32     {
33         for(i=0;i<=lenmax;i++)
34         s[n1+1][i]=t1[i]+'0';
35         s[n1+1][lenmax+1]='\0';
36     }
37     else
38     {
39         if(t1[1])
40         {
41             for(i=1;i<=lenmax;i++)
42             s[n1+1][i-1]=t1[i]+'0';
43             s[n1+1][lenmax]='\0';
44         }
45         else if(t1[2])
46         {
47             for(i=2;i<=lenmax;i++)
48             s[n1+1][i-2]=t1[i]+'0';
49             s[n1+1][lenmax-1]='\0';
50         }
51     }
52 }
53 int main()
54 {
55     int n;
56     int i,j,k;
57     for(i=1;i<=340;i++)
58         add(i,i-1);
59     while(scanf("%d",&n)!=EOF)
60     {
61         printf("%s\n",s[n]);
62     }
63     return 0;
64 }

 

posted @ 2012-05-21 23:49  zhenhai  阅读(168)  评论(0)    收藏  举报