PTA 编程题(C语言)-- 兔子繁殖问题

题目标题:兔子繁殖问题         题目作者:翁恺 浙江大学

已知有一对兔子,每个月可以生一对兔子,而小兔子一个月后又可以生一对小兔子(比如:2月份出生的小兔子4月份可以生育)。也就是说,兔子的对数为:第一个月1对,第二个月2对,第三个月3对,第四个月5对.....假设兔子的生育期为两年,且不死。那么问题来了,你能说出每个月的兔子数么?

输入格式:

输入一个数n,表示第n个月,1<=n<=24。

输出格式:

输出这个月兔子的数目。

输入样例:

4

输出样例:

5

前言:

首先,这是一道经典的用迭代算法来解决的问题。

其次,道题目的作者是在C语言教学界有着很高声望的翁恺老师,很多同学对这道题目理解的不是很准确。下面我跟据我个人的理解和答案的佐证,对题目作以下解释。

(1)“而小兔子一个月后又可以生一对小兔子(比如:2月份出生的小兔子4月份可以生育)”,这句话中第一次出现的“小兔子”一词,应该是指当月出生的这一对小兔子;“一个月后”的含义,根据后面括号内的解释,应该是指当月的下下个月,也就是隔一个月后的意思;“又可以生一对小兔子”,根据后面括号内的的解释,是指从下下个月的当月,及其以后每一个月,都能并且只能生一对小兔子。

(2)输出格式要求“输出这个月兔子的数目”,这里的数目是指第N个月的时候,兔子的总的对儿数(不是个数)。

(3)其实还应该解释与一下:一对兔子是指一只雄性兔子和一只雌性兔子,所生的一对兔子也是一只雄性,一只雌性。每次都是一对生一对。

以上只代表个人观点,以下给出解题思路:

思路:

首先我们把每个月的兔子对,分成3类:(1)当月有繁殖能力的兔子对,(2)当月还没有繁殖能力,但是下一个月就有繁殖能力的兔子;(3)当月出生的兔子。这三类兔子,两两交集为空,三个合集为全集。

设第1月,三类兔子的对数(或者称兔子对的个数)分别为a1,b1,c1,那么第2月三类兔子的对数a2,b2,c2就应满足:

(i)a2 = a1+b1,// 本月有繁殖能力的 =上个月本来就有的 + 上个月没有,但是上个月的下一月会有的。

(ii)b2 = c1,// 本月没有繁殖能力的,但是下一个月就有繁殖能力的 = 上个月刚出生的。

(iii)c2 = a2 = a1+b1。// 本月刚出生的 = 本月有繁殖能力的。

依次类推,每个月本月和它上个月的三类兔子的对数,都满足上述关系。

于是,我们只用确定第一个月a1,b1,a1的数值,然后对用上面的公式迭代N-1次,就得到了第N个月三种兔子的对数了。

代码:

#include <stdio.h>
int main () {
    int N, i, a = 1, b = 0, c = 0;
    scanf("%d", &N);
    for (i = 1; i < N; i++) {
        a = a+b;
        b = c;
        c = a;
    }
    printf("%d", a+b+c);
    return 0;
}

代码中的a,b,c分别表示三类兔子的对数。初始化时a=1, b=0, c=0;然后每月按照公式迭代,迭代的次数为N-1;最后兔子的总对数就是a+b+c。

更多PTA题目的的参考代码,可以在wx小程序里搜“PTA刷题助手”。

猜你喜欢

转载自blog.csdn.net/morn_l/article/details/133955549
今日推荐