UVa:10359 Tiling

可以推出f[i]=f[i-1]+2*f[i-2]

需要用到大数加法。

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 105
using namespace std;
void BigAdd(char a[],char b[],char back[])
{
    int p=0,up=0;
    char c[MAXN]= {0};
    for(int i=strlen(a)-1,j=strlen(b)-1; i>=0||j>=0; --i,--j)
    {
        int x,y,z;
        if(i<0) x=0;
        else x=a[i]-'0';
        if(j<0) y=0;
        else y=b[j]-'0';
        z=x+y+up;
        if(z>9) up=1;
        else up=0;
        c[p++]=z%10+'0';
    }
    if(up) c[p++]='1';
    c[p]=0;
    int q=0;
    for(int i=p-1; i>=0; --i)
        back[q++]=c[i];
    back[q]=0;
}
char f[255][MAXN];
int main()
{
    strcpy(f[0],"1");
    strcpy(f[1],"1");
    for(int i=2; i<=250; ++i)
    {
        char tmp[MAXN];
        BigAdd(f[i-2],f[i-2],tmp);
        BigAdd(f[i-1],tmp,f[i]);
    }
    int n;
    while(scanf("%d",&n)!=EOF)
        printf("%s\n",f[n]);
    return 0;
}


 

你可能感兴趣的:(数学,大数)