Hdu 1250 Hat's Fibonacci

模拟高精度。

第一天由于输入的时候判断是否为0,结果果断超时。额。。。结果第二天重新写的时候马上AC了。泪奔!

CODE:

#include <cstdio>
#include <cstdlib>
#include <cstring>
using  namespace std;

const  int maxn =  535;

int fibo1[maxn];
int fibo2[maxn];
int fibo3[maxn];
int fibo4[maxn];
int result[maxn];



void output()  // 输出 
{
     int i;
     for(i = maxn - 1; i >=  0 && result[i] ==  0; i--);
    printf( " %d ", result[i--]);       // 不输出前导0 
     for(; i >=  0; i--)
    {
        printf( " %04d ", result[i]);
    }
    printf( " \n ");
     return ;
}

void init()  // 预处理 
{
    memset(fibo1,  0sizeof(fibo1));
    memset(fibo2,  0sizeof(fibo2));
    memset(fibo3,  0sizeof(fibo3));
    memset(fibo4,  0sizeof(fibo4));
    memset(result,  0sizeof(result));
     return ;



int main()
{
     int n;
     while(~scanf( " %d ", &n))     //while(~scanf("%d", &n), n) 果断超时。
    {
         int i, j;
         if(n <=  4)
        {
            printf( " 1\n ");
             continue;
        }
        init();        // 预处理 
        fibo1[ 0] = fibo2[ 0] = fibo3[ 0] = fibo4[ 0] =  1;
         int carry =  0;             // 进位 
         for(i =  5; i <= n; i++)   // 模拟加法 
        {
             for(j =  0; j < maxn; j++)
            {
                result[j] = fibo1[j]+fibo2[j]+fibo3[j]+fibo4[j] + carry;
                carry = result[j] /  10000;
                result[j] -= carry* 10000;
            }    
            memcpy(fibo1, fibo2,  sizeof(fibo1));
            memcpy(fibo2, fibo3,  sizeof(fibo2));
            memcpy(fibo3, fibo4,  sizeof(fibo3));
            memcpy(fibo4, result,  sizeof(fibo4));  //  迭代 
        }
        output();
    }
     return  0;

} 

你可能感兴趣的:(fibonacci)