hdu 1041 Computer Transformation

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

const int ten[4] = {1, 10, 100, 1000};
const int maxl = 1020;//最大的位数。
//Compilation Error	1041	0MS	0K	2495 B	C++	Achiberx
//     Accepted	  1041	  93MS	8576K	2546 B	G++	Achiberx
struct BigNumber {
    int d[maxl];
    BigNumber(string s) {
        int len = s.size();
        d[0] = (len-1)/4 + 1;
        int i, j, k;
        for(i = 1; i < maxl; i++) d[i] =  0;
        for(i = len-1; i >= 0; --i) {
            j = (len-1-i)/4 + 1;
            k = (len-1-i)%4;
            d[j] += ten[k] * (s[i]-'0');
        }

        while(d[0]>1 && d[d[0]]==0) --d[0];
    }
    BigNumber() {
        *this = BigNumber(string("0"));
    }
    string toString() {
        string s("");
        int i, j, temp;
        for(i = 3; i >= 1; --i) {
            if(d[d[0]] >= ten[i]) break;
        }
        temp = d[d[0]];
        for(j = i; j >= 0; --j) { 
            s = s + (char)(temp/ten[j] + '0');
            temp %= ten[j];
        }
        for(i = d[0]-1; i > 0; --i) {
            temp = d[i];
            for(j = 3; j >= 0; --j) {
                s = s + (char)(temp/ten[j]+'0');
                temp %= ten[j];
            }
        }
        return s;
    }
    friend BigNumber operator + (const BigNumber &a, const BigNumber &b) {
        BigNumber c;
        c.d[0] = max(a.d[0], b.d[0]);
        int i, x = 0;
        for(i = 1; i <= c.d[0]; ++i) {
            x = a.d[i] + b.d[i] + x;
            c.d[i] = x%10000;
            x /= 10000;
        }
        while(x != 0) {
            c.d[++c.d[0]] = x%10000;
            x /= 10000;
        }
        return c;
    }
};
BigNumber f1[maxl]; //放在主函数无法运行,开的内存过大。
BigNumber f[maxl];

int main()
{

    string s1 = "1";
    string s2 = "2";
    BigNumber add1(s1);
    BigNumber add2(s2);
    f1[1] = add1;
    f1[2] = add2;
    //保存f(1,1)
    for(int i = 3; i <= 1000; i++) {
        f1[i] = f1[i-1] + f1[i-1];
    }
    f[1] = add1;//init // f[] -> f(0, 1);
    f[2] = add1;
    for(int i = 3; i <= 1000; i++) {
        f[i] = f1[i-1] + f[i-2];
    }
    int n;
    while(scanf("%d", &n) != EOF) {
        if(n==1){
            cout << "0" << endl;  continue;
        }
        if(n==2) {
            cout << "1" << endl; continue;
        }
        if(n==3) {
            cout << "1" <<  endl; continue;
        }
        cout << f[n-1].toString() << endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值