#include <iostream>
#include <cstring>
#include <memory.h>
using namespace std;
//1.重点:构造矩阵用于存储每一个月的兔子总数,注意m(1<=m<=10), d(1<=d<=100);
// 即f[idx][0]......f[idx][50] 用于存储每一个月的兔子高精度总数
int f[101][51];
//2.重点:初始化 m 个月前兔子的总数,注意是通过高精度加法,从f[idx][50]开始加!
void init(int idx, int num)
{
for (int i = 50; num != 0 && i >= 0; i --)
{
f[idx][i] = num % 10;
num /= 10;
}
}
//3.重点: 递推关系是 f [n] = f [n - 1] + f [n - m],通过高精度加法
void addition(int idx, int m)
{
int temp;
for (int i = 50; i >= 1; i --)
{
temp = f[idx][i];
f[idx][i] = (temp + f[idx - 1][i] + f[idx - m][i]) % 10; //注意是先加再模
f[idx][i - 1] = (temp + f[idx - 1][i] + f[idx - m][i]) / 10; //注意是先加再除
}
}
int main()
{
int m, d, c;
while (1)
{
cin >> m >> d;
if(m==0&&d==0)
break;
//4.重点:memset(f, 0, sizeof(f));#include <cstring>还是#include <memory.h>?
// 有时候 #include <cstring>和#include <string.h>可能通过编译情况是不一样的!!!
memset(f, 0, sizeof(f));
for (int i = 0; i <= d; i ++)
{
if (i <= m)
init(i, i + 1); //5.重点:初始化 m 个月前兔子的总数,这m个月兔子每个都只是增加一对
else
addition(i, m); //递推兔子的总数
}
for (int i = 0; i <= 50; i ++) //去掉结果开头的 0 。
{
if (f[d][i] != 0)
{
c = i;
break;
}
}
for (int i = c; i <= 50; i ++)
cout << f[d][i];
cout << endl;
}
return 0;
}
1029. Rabbit
最新推荐文章于 2017-06-29 09:52:05 发布