由此题得到一个很类似的状态转移方程:rabbit[i]=rabbit[i-1]+rabbit[i-m],理解为当前月的成年兔子是上一个月已经成年的兔子加上这个月刚成年的兔子。同时由于结果太大,所以要用到高精度加法来辅助一下。。
#include<iostream>
#include<cstring>
using namespace std;
//用二维数组来解决高精度加法的问题
int num[150][150];
int main()
{
int m,d;
while(cin>>m>>d,m!=0||d!=0)
{
memset(num,0,sizeof(num));
num[1][1]=1;
for(int i=2;i<=d+1;i++)
{
if(i<=m)
{
//每个月增加一个兔子
num[i][1]=num[i-1][1]+1;
if(num[i][1]>=10)
{
int v=num[i][1]/10;
num[i][1]=num[i][1]%10;
num[i][2]+=v;
}
}
else
{
//高精度加法
int w=0;
for(int n=1;n<150;n++) //这里有点暴力了
{
//每个位分别相加,加完之后记得进位要清零
num[i][n]=num[i-1][n]+num[i-m][n]+w;
w=0;
if(num[i][n]>=10)
{
w=num[i][n]/10;
num[i][n]=num[i][n]%10;
}
}
}
}
//输出num[d+1][]而不是输出num[d][]
for(int i=149;i>=1;i--)
{
if(num[d+1][i]!=0)
{
for(int j=i;j>=1;j--)
cout<<num[d+1][j];
cout<<endl;
break;
}
}
}
return 0;
}
#include<iostream>
#include<cstring>
using namespace std;
//用二维数组来解决高精度加法的问题
int num[150][150];
int main()
{
int m,d;
while(cin>>m>>d,m!=0||d!=0)
{
memset(num,0,sizeof(num));
num[1][1]=1;
for(int i=2;i<=d+1;i++)
{
if(i<=m)
{
//每个月增加一个兔子
num[i][1]=num[i-1][1]+1;
if(num[i][1]>=10)
{
int v=num[i][1]/10;
num[i][1]=num[i][1]%10;
num[i][2]+=v;
}
}
else
{
//高精度加法
int w=0;
for(int n=1;n<150;n++) //这里有点暴力了
{
//每个位分别相加,加完之后记得进位要清零
num[i][n]=num[i-1][n]+num[i-m][n]+w;
w=0;
if(num[i][n]>=10)
{
w=num[i][n]/10;
num[i][n]=num[i][n]%10;
}
}
}
}
//输出num[d+1][]而不是输出num[d][]
for(int i=149;i>=1;i--)
{
if(num[d+1][i]!=0)
{
for(int j=i;j>=1;j--)
cout<<num[d+1][j];
cout<<endl;
break;
}
}
}
return 0;
}