大数递推
本题要点:
1、递推公式:f[n] = f[n - 1] + f[n - 2]
2、推导:
n >= 3 时候,如果最后一位是1, 相当于前 n - 1 位的所有 1和2 的排列方式。
如果最后一位是 2, 相当于 前 n - 2 位的所有 1和2 的排列方式。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int MaxN = 210;
int n;
struct bign
{
int d[200];
int len;
bign()
:len(0)
{
memset(d, 0, sizeof d);
}
}f[MaxN];
bign add(bign a, bign b)
{
bign c;
int carry = 0, tmp;
for(int i = 0; i < a.len || i < b.len; ++i)
{
tmp = a.d[i] + b.d[i] + carry;
c.d[c.len++] = tmp % 10;
carry = tmp / 10;
}
while(carry)
{
c.d[c.len++] = carry % 10;
carry /= 10;
}
return c;
}
void init()
{
f[1].len = f[2].len = 1, f[1].d[0] = 1, f[2].d[0] = 2;
for(int i = 3; i < MaxN; ++i)
{
f[i] = add(f[i - 1], f[i - 2]);
}
}
void print(bign a)
{
for(int i = a.len - 1; i >= 0; --i)
{
printf("%d", a.d[i]);
}
printf("\n");
}
int main()
{
init();
while(scanf("%d", &n) != EOF)
{
print(f[n]);
}
return 0;
}
/*
1
3
5
*/
/*
1
3
8
*/