题目大意:开始时有1对成年兔子,每一对成年的兔子每个月可以生一对小兔子,给出m和d(m<=10,d<=100),m表示小兔子在m个月以后成年,问d个月后共有多少对兔子(假设兔子不会死亡)。
算法实现:由于m和d都很小,可以直接模拟。num[0]表示成年兔子的数目,num[i]表示还有i个月成年的兔子的数目,更新d次num数组即可。最后的总数可能会很大,所以要用高精度的方法。
具体代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#define get_max(a,b) ((a)>(b)?(a):(b))
using namespace std;
const int maxn=200;
struct bign
{
int len,s[maxn];
bign()
{
memset(s,0,sizeof(s));
len=1;
}
bign(int num)
{
*this=num;
}
bign operator = (const char *num)
{
len=strlen(num);
for(int i=0;i<len;i++)
s[i]=num[len-i-1]-'0';
return *this;
}
bign operator = (int num)
{
char s[maxn];
sprintf(s,"%d",num);
*this=s;
return *this;
}
string str() const
{
string res="";
for(int i=0;i<len;i++)
res=(char)(s[i]+'0')+res;
if(res=="") res="0";
return res;
}
bign operator + (const bign &b) const
{
int max_len=get_max(len,b.len);
bign c;
c.len=0;
for(int i=0,g=0;g||i<max_len;i++)
{
int x=g;
if(i<len) x+=s[i];
if(i<b.len) x+=b.s[i];
c.s[c.len++]=x%10;
g=x/10;
}
return c;
}
};
ostream& operator << (ostream &out,const bign &x)
{
out<<x.str();
return out;
}
int main()
{
int m,d;
bign num[11];
while(cin>>m>>d)
{
if(m==0&&d==0) break;
num[0]=1;//num[0]表示成年的兔子的数目
for(int i=1;i<=m;i++)
num[i]=0;//num[i]表示还有i个月成年的兔子的数目
for(int i=1;i<=d;i++)
{
num[0]=num[0]+num[1];
for(int i=1;i<m;i++)
num[i]=num[i+1];
num[m]=num[0];
}
bign sum=0;
for(int i=0;i<=m;i++)
sum=sum+num[i];
cout<<sum<<endl;
}
return 0;
}