经典的兔子问题


这道题是:有一对兔子,长到第三个月开始,每个月生一对小兔子,等到小兔子长到第三个月时,又开始每个月生一对小兔子,假设兔子一直不死,那么每个月兔子的数量是多少?

刚拿到题,感觉很简单。可是仔细一想,就发现,还是很麻烦的。因为小兔子到第三个月才会再生小兔子,而小兔子生小小兔子的时候,老兔子也会再生小兔子,那么他的增量不是固定的,而是呈一种非连续递增状态,每两个月变一次,想用一个式子表示出来是有相当难度的。好了,够扯淡得了。

下面看我的解决方法,既然每个月兔子的年龄不是相同的,有一个月大的(用mon1表示数量),两个月大的(mon2),和三个月及三个月以上的(mon3),那么就可以把每个月的兔子分为这三类,然后计算每类兔子的数量,最后相加就是它的总量。

各类兔子的关系是这样的,先从mon3的看,mon3(本月)=mon2(上个月)+mon3(上个月),接着,mon2(本月)=mon1(上个月),然后,mon1=mon3(上个月)。

解释一下,本月三个月大的兔子数就是上个月三个月和两个月大的兔子数之和,因为小兔子长大了;同理本月两个月大的是上月一个月大的长大的,而本月一个月大的是本月三个月大的兔子新生的。最后这几类数量相加就是每个月的总数。

问题到此结束。

附:我的代码如下:

<span style="font-size:18px;">int robert(int n){
		int inum=0,j=0;
		int mon1=0,mon2=0,mon3=1;
		if(n<3)
			inum=1;//总数
		if(n>=3)
		{
			for(j=3;j<=n;++j)
			{
				mon3=mon3+mon2;
				mon2=mon1;
				mon1=mon3;
			}
			inum=mon3+mon2+mon1;
		}
		return inum;
		
	}</span>
这个结果和菲波那楔数的结果是相同的。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值