繁殖问题
问题描述 :
有一家生化所,一月份引入一对新生的小白鼠。这对小白鼠生长两个月后,在第三、第四、第五个月各繁殖一对新小白鼠,在第六个月停止繁殖,在第七个月则死亡。新生的小白鼠也如此繁殖。问在第N个月时,活的小白鼠有多少对?
输入说明 :
你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。每组输入数据由一行组成,其中只有一个整数N(0 < N ≤ 50)。两组输入数据间无空行。
输出说明 :
对于每组测试数据,你的程序需要向标准输出设备(通常为启动该程序的文本终端)输出一行,其中只有一个整数,即第N个月时活的小白鼠有几对,所有数据前后没有多余的空行,两组数据之间也没有多余的空行。
输入范例 :
1 2 3 4 5 6 7 8 30
输出范例 :
1 1 2 3 5 7 10 15 67066
新生小白鼠有两个月的等待期,所以第三个月小白鼠数量变化 这里用新旧称能否繁殖的小白鼠
从第三个月开始,2位置(3月份)小白鼠繁殖,设一个变量 i ;
此时i=2; nums[i]=1,news[i]=0;
i=3时, nums[i]=1+1;news[i]=1;
i=4时,新小白鼠不繁殖,旧小白鼠继续繁殖,nums[i]=2+1;news[i]=1;
i=5时,有一只新小白鼠不繁殖,生于小白鼠都繁殖 nums[i]=3+(3-1)=5; news[i]=3-1=2;
当i=6时,由题目中第六个月小白鼠停止繁殖,又第五个月中新小白鼠有两只不繁殖,因此剩余5-3=2只繁殖,此时没有小白鼠死亡,则nums[i]=5+(5-2-1)=7,news[i]=5-2-1=2;
当i=7时,6个月之前的小白鼠死亡,则剩余7-1=6只小白鼠,又有2只不繁殖,剩余6-2=4只繁殖,则
七月份小白鼠数量为 7只小白鼠减去一直死掉的再加上4只繁殖的 即 num[i]=7 - 1+4=10; news[i] =6-2=4;
就是说 nums[i]=(nums[i-1]-1)+(nums[i-1]-news[i-1]-1) news[i]=num[i-1]-1-news[i-1]; 1为死亡的小白鼠数量为1;
从第八月开始,死亡小白鼠和停止繁殖小白鼠都发生,
当i = 8时,2月份的小白鼠死亡,同时三月份的小白鼠停止繁殖
死亡小白鼠数量为 2月份新生小白鼠 : news[i-6]=0;
停止繁殖的小白鼠为3月份新生小白鼠 :news[i-5]=1;
则 nums[i]=10-1-4+10=15 和 news[i]=10-4-1=5;
当 i = 9 时, 死亡小白鼠数量为 news[i-6]=1 (3月份新生小白鼠); 停止繁殖的小白鼠为 news[i-5]=1(4月份新生小白鼠);
9月份新生小白鼠为 nums[i-1]-news[i-1]-news[i-6]-news[i-5]=8;
则 nums[i] =8+nums[i-1]-news[i-6]=22;
当i = 10 时,死亡小白鼠数量为 news[i-6]=1 (4月份新生小白鼠); 停止繁殖的小白鼠为 news[i-5]=2 (5月份新生小白鼠);
10月份新生小白鼠为 nums[i-1]-news[i-1]-news[i-6]-news[i-5]=22-8-1-2=11;
则 nums[i]=11+nums[i-1]-news[i-6] =11 + 22 - 1=32;
开始(第 i+1月) | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
当前白鼠数量nums[i] | 1 | 1 | 2 | 3 | 5 | 7 | 10 | 15 | 22 | 32 |
当前月新生白鼠news[i] | 0 | 0 | 1 | 1 | 2 | 2 | 4 | 5 | 8 | 11 |
代码如下
#include <cstdio>
int main()
{
int n;
int nums[51] = { 0 }, news[51] = {0};
nums[1] = nums[2] = 1;
news[1] = 0; news[2] = 0;
nums[3] = 2; nums[4] = 3; nums[5] = 5; nums[6] = 7; nums[7] = 10;
news[3] = 1; news[4] = 1; news[5] = 2; news[6] = 2; news[7] = 4;
for (int i = 8; i <= 50; i++)
{
int temp = nums[i - 1] - news[i - 1] - news[i - 6] - news[i - 5];
nums[i] = temp + nums[i - 1] - news[i - 6];//当月小白鼠数量
news[i] = temp;//新小白鼠数量
}
while (scanf_s("%d", &n) != EOF)
{
printf("%d", nums[n]);
}
return 0;
}
来源:CSDN
作者:VictorierJwr
链接:https://blog.csdn.net/VictorierJwr/article/details/104007311