POJ 2506 Tiling(递归+高精度)
说明:一个大叔如果是乘以一个一位数,再加上或减去一个数可以用每一位分别于这个因子相乘,与加数相加减数相减即可;
例如12345678*2+23456;
可以用变量记录8*2+6的余数与商下一次既是7*2+5+上一次的商。
详见代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }