繁殖问题

繁殖问题

问题描述 :

有一家生化所,一月份引入一对新生的小白鼠。这对小白鼠生长两个月后,在第三、第四、第五个月各繁殖一对新小白鼠,在第六个月停止繁殖,在第七个月则死亡。新生的小白鼠也如此繁殖。问在第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;
}

 

发布了9 篇原创文章 · 获赞 10 · 访问量 132

猜你喜欢

转载自blog.csdn.net/VictorierJwr/article/details/104007311