http://acm.hust.edu.cn/vjudge/contest/130824#problem/E
题解:此题找规律,发现f[n] = f[n - 1] + f[n - 2],但是f[n]是大数,所以要用到大数加法模板(我用的是上交的模板),不算难题
思考:
1、给已经定义好的结构体赋值的方法为令构造函数等于这个结构体
bi[3] = BigNumber(string ("4"));
2、用结构体成员函数的时候,别忘了在函数名后面写括号
3、模板不能抄错
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
const int maxn = 10010;
const int maxl = 1000;
const int ten[4] = {1, 10, 100, 1000};
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 - i - 1) / 4 + 1;
k = (len - i - 1) % 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;
}
} zero ("0"), d, temp, mid1[15], bi[maxn];
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;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen ("in.txt", "r", stdin);
#endif // ONLINE_JUDGE
int n;
bi[3] = BigNumber(string ("4"));
bi[4] = BigNumber(string ("7"));
for (int i = 5; i < maxn; i++) {
bi[i] = bi[i - 1] + bi[i - 2];
}
while (scanf ("%d", &n) != EOF) {
cout << bi[n].toString() << endl;
}
return 0;
}