题目大意是:有一对基因十分良好的兔子,每个月都会生一对小兔子,经过m个月后,小兔子又会长成大兔子,大兔子就可以又生一对小兔子。那么给出d个月后,总共有多少对兔子。(兔子期间不死亡,1 <= m <= 10 , 1 <= d <= 100);
思路:我的想法是将兔子分成2种,一种是小兔子,另一种是大兔子。小兔子又依照它们的年龄分成n份(1 <= n <= m-1),而大兔子的话,无论多大的兔子,我都把它当成只是有生殖能力的兔子。接着我定义一个存放小兔子和大兔子数组的数组,大小为d+1,然后迭代d次。一开始数组的[d]为1,表示一开始有一只大兔子。没一轮迭代,我做的事情是更新小兔子的数目,rabbit[i] = rabbit[i-1],代表岁数为i-1的兔子变成i个月的兔子,然后rabbit[0] = rabbit[d],表示大兔子生的小兔数目。结束迭代,把数组的所有元素加起来就是最后的结果了。但这里需要用到高精度加法。
代码:
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
const int Max = 11;
string rabbits[Max];
string HPAdd(string num1, string num2){
int l1 = num1.length();
int l2 = num2.length();
int carry = 0;
if(l2 > l1){
swap(num1, num2);
swap(l1, l2);
}
string result = num1;
int o1, o2, r, i, j;
int count = result.length()-1;
for(i = l1-1, j = l2-1; i >= 0 && j >= 0; --i, --j){
o1 = num1[i] - '0';
o2 = num2[j] - '0';
r = (o1 + o2 + carry) % 10;
carry = (o1 + o2 + carry) / 10;
result[count--] = '0' + r;
}
while(count >= 0 && carry != 0){
o1 = result[count] - '0';
r = (o1 + carry) % 10;
carry = (o1 + carry) / 10;
result[i] = '0' + r;
}
if(carry != 0)
result = "1" + result;
return result;
}
int main(){
int m, d;
cin >> m >> d;
while(m != 0){
if(d == 0 && m != 0)
cout << 1 << endl;
else{
for(int i = 0; i < Max; ++i)
rabbits[i] = "0";
rabbits[m] = "1";
// rabbits[0] = 1;
for(int k = 1; k <= d; ++k){
// rabbits[m] += rabbits[m-1];
rabbits[m] = HPAdd(rabbits[m-1], rabbits[m]);
for(int i = m-1; i > 0; --i){
rabbits[i] = rabbits[i-1];
}
rabbits[0] = rabbits[m];
}
//int sum = 0;
string sum = "0";
for(int i = 0; i <= m; ++i)
// sum += rabbits[i];
sum = HPAdd(sum, rabbits[i]);
cout << sum << endl;
}
cin >> m >> d;
}
}