Problem25

#include <iostream>
#include <string>
using namespace std;

#define NUM 1000

string
reverse(string *s)
{
    string t;
    t.resize(s->size());

    for (string::size_type i = 0, e = s->size(); i < e; i++)
    {
        t.at(i) = s->at(e-i-1);
    }

    return t;
}

string
sum(string *psrc, string *pdst)
{
    if (psrc->size() > pdst->size())
    {
        pdst->insert(pdst->begin(), '0');
    }

    string r("");
    int    crr = 0;

    for (int i = pdst->size()-1; i >= 0; i--)
    {
        int n = psrc->at(i) + pdst->at(i) - '0'*2 + crr;
        r.push_back('0' + n%10);
        crr = n/10;
    }

    if (crr != 0)
    {
        r.push_back(crr+'0');
    }

    return reverse(&r);
}

int
main(int argc, char **argv)
{
    string prepre("1"), pre("1");
    string tmp("");
    int ans = 2;

    while (tmp.size() < NUM)
    {
        tmp = sum(&pre, &prepre);
        prepre = pre;
        pre = tmp;
        ans++;
    }

    cout << ans << endl;

    return 0;
}