【递推+高精度】POJ2506-Tiling

思路别人那里讲的很清楚了,我就不阐述了。链接

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 using namespace std;
 6 const int MAXN=250+5;
 7 int n;
 8 struct Big
 9 {
10     int num[MAXN],len;
11 };
12 Big ans[MAXN];
13 
14 void dou(Big &x)
15 {
16     for (int i=0;i<x.len;i++)
17     {
18         x.num[i]=x.num[i]*2;
19         if (i>0)
20         {
21             x.num[i]+=x.num[i-1]/10;
22             x.num[i-1]=x.num[i-1]%10;
23         }
24     }
25     if (x.num[x.len-1]>9)
26     {
27         x.num[x.len]=x.num[x.len-1]/10;
28         x.num[x.len-1]=x.num[x.len-1]%10;
29         x.len++;
30     }
31 }
32 
33 void plu(Big x,Big y,Big &z)
34 {
35     memset(z.num,0,sizeof(z.num));
36     int length=max(x.len,y.len);
37     for (int i=0;i<length;i++)
38     {
39         z.num[i]=z.num[i]+x.num[i]+y.num[i];
40         z.num[i+1]=z.num[i]/10;
41         z.num[i]=z.num[i]%10;
42     }
43     if (z.num[length]!=0) z.len=length+1;
44         else z.len=length;
45 }
46 
47 int main()
48 {
49     while (scanf("%d",&n)!=EOF)
50     {
51         ans[0].num[0]=1;ans[0].len=1;
52         ans[1].num[0]=1;ans[1].len=1;
53         for (int i=2;i<=n;i++)
54         {
55             dou(ans[i-2]);
56             plu(ans[i-2],ans[i-1],ans[i]);
57         }
58         for (int i=ans[n].len-1;i>=0;i--) cout<<ans[n].num[i];cout<<endl;
59     }
60     return 0;
61 }

 

posted @ 2015-07-31 21:57  iiyiyi  阅读(281)  评论(0编辑  收藏  举报