1. 程式人生 > >HDU 5686(斐波那契數列大數)

HDU 5686(斐波那契數列大數)

通過分析,可以發現題目就是一個斐波那契數列,但數很大,所以果斷高精度模板。

#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
string &_string_add_string (const string &a, const string &b, string &res) {
    int sum_value = 0, add_bit = 0;
    const int alen = a.length(), blen = b.length();
    res = "0" + (alen > blen ? a : b);
    for (int i = alen-1, j = blen-1, k = res.length() - 1;
            i >= 0 || j >= 0 || add_bit > 0;
            --i, --j, --k) {
        sum_value = (i>=0 ? a[i]-48: 0) + (j>=0 ? b[j]-48: 0) + add_bit;
        add_bit = sum_value / 10;
        res[k] = sum_value%10 + '0';
    }
    if (res[0] == '0') { res = res.substr (1, res.length() - 1); }
    return res;
}
string fib (int n) {
    if (0 == n) { return "0"; }
    if (1 == n || 2 == n) { return "1"; }
    string a = "1", b = "1", ret = "0";
    for (int i = 3; i <= n; ++i) {
        _string_add_string (a, b, ret);
        b = a;
        a = ret;
    }
    return ret;
}
int main (void) {
    int n;
    string a, b, c;
    string ret;
    while (scanf ("%d", &n) != EOF) {
        printf ("%s\n", fib (n+1).c_str() );
    }
    return 0;
}