思路:首先创建两个函数operate() 和cycle(),其中operate()求得两个大数之和,cycle()将数组向后平移一位。首先初始化数组num,数组num存储兔子的数量,其中num[0]表示成熟兔子的数量,num[i]表示出生第i个月的数量。分别表示出第i个月不同种类兔子的数量,而后依次递推(第i个月中出生x个月兔子的数量等于第i-1个月出生x-1个月兔子的数量),直至到达第m个月。最后把数组num中所有的元素(除去最后一个)相加既得到兔子的总数。
程序
#include <iostream>
#include "string"
using namespace std;
#include "string"
using namespace std;
string operate(string a,string b) //求两个大数之和
{
int aa = a.length();
int bb = b.length();
string result; //用来保存两个string 的和
string q;
//保证两个数的长度相等,长度小的补0
if (aa>bb)
{
q.assign(aa-bb,'0'); //assagin函数为c++中的赋值函数
b=q+b;
}
else
{
q.assign(bb-aa,'0');
a=q+a;
}
//两数相加
int u = 0; //u为进位
result = result.assign(a.length(),'0');
for (int i = a.length()-1;i>=0;i--)
{
int temp = (a[i] - '0') + (b[i] - '0') + u;
if(temp >=10)
{
u = 1;
temp = temp%10;
}
else
u = 0;
result[i] = temp + '0';
}
//如果最后一位出现大于10的情况时,应该向前进一位
if(u ==1)
result= '1'+result;
return result;
}
void cycle(string num[],int n) //把数组num里面第数向后平移一位,并且新的num[0]等于旧的num[0]与新的num[n-1]之和
{
for(int i=n-1;i>0;i--)
num[i]=num[i-1];
num[0]=operate(num[0],num[n-1]);
}
int main()
{
int m,d;
while(cin>>m>>d)
{
if(m==0&&d==0)
break;
string num[11]; //数组num存储兔子的数量,其中num[0]表示成熟兔子的数量,num[i]表示出生第i个月的数量
string sum="0";
num[0]="1";
for(int i=1;i<=m;i++) //初始化数组num
num[i]="0";
for(int i=1;i<=d;i++) //求第i个月各种类的数量
cycle(num,m+1);
for(int i=0;i<m;i++) //求得所有兔子之和,此时num[0]中已经包含了num[m]的数量
sum=operate(num[i],sum);
cout<<sum<<endl;
}
return 0;
}
}
void cycle(string num[],int n) //把数组num里面第数向后平移一位,并且新的num[0]等于旧的num[0]与新的num[n-1]之和
{
for(int i=n-1;i>0;i--)
num[i]=num[i-1];
num[0]=operate(num[0],num[n-1]);
}
int main()
{
int m,d;
while(cin>>m>>d)
{
if(m==0&&d==0)
break;
string num[11]; //数组num存储兔子的数量,其中num[0]表示成熟兔子的数量,num[i]表示出生第i个月的数量
string sum="0";
num[0]="1";
for(int i=1;i<=m;i++) //初始化数组num
num[i]="0";
for(int i=1;i<=d;i++) //求第i个月各种类的数量
cycle(num,m+1);
for(int i=0;i<m;i++) //求得所有兔子之和,此时num[0]中已经包含了num[m]的数量
sum=operate(num[i],sum);
cout<<sum<<endl;
}
return 0;
}