sicily 1029 Rabbits

来源:互联网 发布:linux netlink 编辑:程序博客网 时间:2024/06/08 07:54

题目大意是:有一对基因十分良好的兔子,每个月都会生一对小兔子,经过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;}}