模拟高精度。

第一天由于输入的时候判断是否为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;

} 

posted on 2012-07-21 21:17  有间博客  阅读(166)  评论(0)    收藏  举报