Tiling(递推,高精度)

http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2067&cid=1158

View Code
#include<stdio.h>
#include<string.h>
#define max(a, b) (a>b?a:b)
struct node
{
    int len, a[1000] ;
}dp[251] ;
void add(node a, node b, node &c)
{
    int i ;
    int len = max(a.len, b.len) ;
    for(i=1; i<=len; i++)
    c.a[i] = a.a[i] + b.a[i] ;
    for(i=1; i<=len; i++)
    {
        if(c.a[i]>9)
        {
            c.a[i] -= 10 ;
            c.a[i+1]++ ;
        }
    }
    if(c.a[len+1]!=0)
    c.len = len + 1 ;
    else
    c.len = len ;
}
void mul(node &x)
{
    int i ;
    for (i=1;i<=x.len;i++)
    x.a[i]*=2;
    for (i=1;i<=x.len;i++)
    {
        if (x.a[i]>9)
        {
           x.a[i]-=10;
           x.a[i+1]++;
        }
    }
    if (x.a[x.len+1]!=0)
    x.len++;
}
int main()
{
    int i, n;
    while(scanf("%d", &n)!=EOF)
    {
          memset(dp,0,sizeof(dp));
          dp[0].len=1;
          dp[0].a[1]=1;
          dp[1].len=1;
          dp[1].a[1]=1;
          for (i=2;i<=n;i++)
          {
                mul(dp[i-2]);
                add(dp[i-2],dp[i-1],dp[i]);
          }
          for (i=dp[n].len;i>=1;i--)
          printf("%d",dp[n].a[i]);
          printf("\n");
    }
    return 0;
}

第一次做高精度的题

 

posted @ 2013-04-20 23:02  yelan@yelan  阅读(219)  评论(0编辑  收藏  举报