Có nhiều cách đánh chỉ số cho dãy số. Có tài liệu đánh chỉ số dãy số từ chỉ số 0, cũng có nhiều tài liệu đánh chỉ số dãy số bắt đầu từ 1. Trong bài toán này, chúng ta định nghĩa dãy Fibonacci như sau: f[1]=f[2]=1 và f[n]=f[n−1]+f[n−2],∀n≥3 Yêu cầu Cho T số nguyên dương N, với mỗi số hãy tính số fibonacci thứ N. Dữ liệu Gồm T dòng ( T<106 ) mỗi dòng ghi 1 số nguyên dương N ( N≤1000 ). Kết quả In ra T dòng, mỗi dòng in ra số fibonacci thứ N tương ứng. Ví dụ INPUT Copy 1 2 7 OUTPUT Copy 1 1 1 Nhớ là C++ nha

2 câu trả lời

#include <bits/stdc++.h>
using namespace std;

const int base = 1000000000; const int base_digits = 9;
struct bigint {
    vector<int> a; int sign;
 
    bigint() :
        sign(1) {
    }
 
    bigint(long long v) {
        *this = v;
    }
 
    bigint(const string &s) {
        read(s);
    }

    void operator=(long long v) {
        sign = 1;
        if (v < 0)
            sign = -1, v = -v;
        for (; v > 0; v = v / base)
            a.push_back(v % base);
    }
 
    bigint operator+(const bigint &v) const {
        if (sign == v.sign) {
            bigint res = v;
 
            for (int i = 0, carry = 0; i < (int) max(a.size(), v.a.size()) || carry; ++i) {
                if (i == (int) res.a.size())
                    res.a.push_back(0);
                res.a[i] += carry + (i < (int) a.size() ? a[i] : 0);
                carry = res.a[i] >= base;
                if (carry)
                    res.a[i] -= base;
            }
            return res;
        }
        return *this + (v);
    }
 
    void trim() {
        while (!a.empty() && !a.back())
            a.pop_back();
        if (a.empty())
            sign = 1;
    }

    void read(const string &s) {
        sign = 1;
        a.clear();
        int pos = 0;
        while (pos < (int) s.size() && (s[pos] == '-' || s[pos] == '+')) {
            if (s[pos] == '-')
                sign = -sign;
            ++pos;
        }
        for (int i = s.size() - 1; i >= pos; i -= base_digits) {
            int x = 0;
            for (int j = max(pos, i - base_digits + 1); j <= i; j++)
                x = x * 10 + s[j] - '0';
            a.push_back(x);
        }
        trim();
    }
 
    friend istream& operator>>(istream &stream, bigint &v) {
        string s;
        stream >> s;
        v.read(s);
        return stream;
    }
 
    friend ostream& operator<<(ostream &stream, const bigint &v) {
        if (v.sign == -1)
            stream << '-';
        stream << (v.a.empty() ? 0 : v.a.back());
        for (int i = (int) v.a.size() - 2; i >= 0; --i)
            stream << setw(base_digits) << setfill('0') << v.a[i];
        return stream;
    }
};

const int N = 1e3;
bigint fibo[N + 5];

int n;
int main() {
    fibo[1] = 1;
    fibo[2] = 1;
    for (int i = 3; i <= N; ++i) fibo[i] = fibo[i - 1] + fibo[i - 2];
    
    while (cin >> n) {
        cout << fibo[n] << "\n";
    }
}

#include <bits/stdc++.h>
using namespace std;

const int base = 1000000000; const int base_digits = 9;
struct bigint {
    vector<int> a; int sign;
 
    bigint() :
        sign(1) {
    }
 
    bigint(long long v) {
        *this = v;
    }
 
    bigint(const string &s) {
        read(s);
    }

    void operator=(long long v) {
        sign = 1;
        if (v < 0)
            sign = -1, v = -v;
        for (; v > 0; v = v / base)
            a.push_back(v % base);
    }
 
    bigint operator+(const bigint &v) const {
        if (sign == v.sign) {
            bigint res = v;
 
            for (int i = 0, carry = 0; i < (int) max(a.size(), v.a.size()) || carry; ++i) {
                if (i == (int) res.a.size())
                    res.a.push_back(0);
                res.a[i] += carry + (i < (int) a.size() ? a[i] : 0);
                carry = res.a[i] >= base;
                if (carry)
                    res.a[i] -= base;
            }
            return res;
        }
        return *this + (v);
    }
 
    void trim() {
        while (!a.empty() && !a.back())
            a.pop_back();
        if (a.empty())
            sign = 1;
    }

    void read(const string &s) {
        sign = 1;
        a.clear();
        int pos = 0;
        while (pos < (int) s.size() && (s[pos] == '-' || s[pos] == '+')) {
            if (s[pos] == '-')
                sign = -sign;
            ++pos;
        }
        for (int i = s.size() - 1; i >= pos; i -= base_digits) {
            int x = 0;
            for (int j = max(pos, i - base_digits + 1); j <= i; j++)
                x = x * 10 + s[j] - '0';
            a.push_back(x);
        }
        trim();
    }
 
    friend istream& operator>>(istream &stream, bigint &v) {
        string s;
        stream >> s;
        v.read(s);
        return stream;
    }
 
    friend ostream& operator<<(ostream &stream, const bigint &v) {
        if (v.sign == -1)
            stream << '-';
        stream << (v.a.empty() ? 0 : v.a.back());
        for (int i = (int) v.a.size() - 2; i >= 0; --i)
            stream << setw(base_digits) << setfill('0') << v.a[i];
        return stream;
    }
};

const int N = 1e3;
bigint fibo[N + 5];

int n;
int main() {
    fibo[1] = 1;
    fibo[2] = 1;
    for (int i = 3; i <= N; ++i) fibo[i] = fibo[i - 1] + fibo[i - 2];
    
    while (cin >> n) {
        cout << fibo[n] << "\n";
    }
}

hoangconghung0508

Câu hỏi trong lớp Xem thêm