hdu 1250 Hat's Fibonacci (大数相加,水题)

小记:之所以对这个水题写篇博文,主要是为了让自己谨记在写大数相加的代码时,要注意一点,用整数数组实现N进制的大整数相加算法在输出的时候记得用%0xd (x = lgN)。铭记这点就OK了。


题解:我是用数组进行预处理的,bignum[x][0] 表示第x个斐波那契数相对于N进制有多少位。然后从bignum[x][bignum[x][0]] 一直输出到bignum[x][1]。


代码奉上:

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

#define max(x,y) ((x)>(y))?(x):(y)
#define N 7500

int bignum[N][670];

void add(int x){
    int i, t;
    t = max(bignum[x - 1][0],bignum[x - 2][0]);
    t = max(t,bignum[x - 3][0]);
    t = max(t,bignum[x - 4][0]);
    for(i = 1; i <= t; i ++){
        bignum[x][i] += bignum[x - 1][i] + bignum[x - 2][i] + bignum[x - 3][i] + bignum[x - 4][i];
        bignum[x][i + 1] = bignum[x][i] / 10000;
        bignum[x][i] %= 10000;
    }
    if(bignum[x][i] > 0)bignum[x][0] = t + 1;//存储第X个斐波那契数它的万进制表示有多少位
    else bignum[x][0] = t;
}

void calc(){
    int i;
    for(i = 5; i < N; i ++){
        add(i);
    }
}

int main() {
    //freopen("d:\\in.txt","r",stdin);
    //freopen("d:\\out.txt","w",stdout);

    int i, j, n;
    for(i = 1; i < 5; i++){
        bignum[i][0] = 1;
        bignum[i][1] = 1;
    }
    calc();
    while(~scanf("%d",&n)){
        if(n < 5){printf("1\n");continue;}
        i = bignum[n][0];
        printf("%d",bignum[n][i]);
        for(i -= 1; i > 0; i--){
            printf("%04d",bignum[n][i]);//注意输出
        }
        putchar('\n');
    }
    return 0;
}


你可能感兴趣的:(hdu 1250 Hat's Fibonacci (大数相加,水题))