POJ 2506 Tiling(递归+高精度)

 说明:一个大叔如果是乘以一个一位数,再加上或减去一个数可以用每一位分别于这个因子相乘,与加数相加减数相减即可;

例如12345678*2+23456;

可以用变量记录8*2+6的余数与商下一次既是7*2+5+上一次的商。

详见代码:

 1 /*
 2 递推式:F(n) = 2 * F(n-2) + F(n - 1)
 3 +大数相加相乘算法。
 4 */
 5 # include <stdio.h>
 6 # include <string.h>
 7 int a[255][2000];//255下表用于递推,2000下标用于存储数据的位数。
 8 int main()
 9 {
10     int n,i,j;
11     while(scanf("%d",&n) !=EOF)
12     {
13         memset(a,0,sizeof(a));
14         a[0][0]=1;//初始化。位数为零。
15         a[1][0]=1;
16         a[2][0]=3;
17         if(n<=2)
18             printf("%d\n",a[n][0]);
19         else
20         {
21             int count = 1;//用于记录位数。
22             for(i=3;i<=n;i++)
23             {
24                 int beyond=0;//用于记录是否增加位数,及相加运算赋值。
25                 int p=0;
26                 for(j=0;j<count;j++)
27                 {
28                     p=a[i-2][j]*2 + a[i-1][j] + beyond;//对i-2的每一位乘以2加i-1.
29                     a[i][j]=p%10;
30                     beyond =p/10;//记录进位数。
31                 }
32                 if(beyond)
33                 {
34                     a[i][count]=beyond;
35                     count++;
36                 }
37             }
38             for(i=count-1;i>=0;i--)
39             {
40                 printf("%d",a[n][i]);
41             }
42             printf("\n");
43         }
44     }
45     return 0;    
46 }
View Code

posted on 2013-08-05 21:28  随风浪子的博客  阅读(184)  评论(0编辑  收藏  举报

导航