【华为练习题 】 长寿的兔子

【华为练习题 】 长寿的兔子

题目

从前有一对长寿的兔子,他们每个月生出一对小兔子,第一个月新生产的兔子两个月就长大了,在第三个月初开始生他们的下一代小兔子,这样一代一代的生下去,不考虑兔子的寿命,求第n个月出生多少对小兔子

简单示例:

比如输入1,第一个月出生的兔子只有一对,所以输出为1

比如输入2,第二个月出生的兔子只有一对,所以输出为1

比如输出为3,则该月份有两对兔子出生,则输出为2

要求:

实现以下接口:

输入一个正整数,表示第几个月,输出该月份生产出的小兔子的对数

调用者会保证:

输入的月份与生产的兔子数目都为unsigned int 能表达的数字

分析

非递归:将兔子分为大中小3类(大兔子:可以产小兔子,中兔子:成长1个月的小兔子,下个月会变成大兔子),每个月的大兔子数量为上个月的大兔子数量加上中兔子数量,中兔子数量为上个月小兔子数量,小兔子数量为上个月大兔子数量。

递归:某月出生的兔子数量等于大兔子数量,大兔子数量等于上个月的大兔子数量加上中兔子数量,而上个月的中兔子数量等于上上个月的小兔子数量,等于上上上个月的大兔子数量,于是得到递推式:

f(n) = f(n-1) + f(n-3) (n>=3)

解答

非递归方式

#include <iostream>
using namespace std;

unsigned rabbit(unsigned n){
    unsigned  big = 1, mid = 0, little = 0;
    while (n--)
    {
        unsigned tmp1 = big, tmp2 = mid, tmp3 = little;
        big = tmp1 + tmp2;
        mid = tmp3;
        little = tmp1;
    }
    return big;
}

int main()
{
    unsigned n;
    cin >> n;
    cout << rabbit(n) << endl;
    return 0;
}

递归方式

#include <iostream>
using namespace std;

unsigned rabbit(unsigned n){
    if (n <= 2) return 1;
    return rabbit(n-1) + rabbit(n-3);
}

int main()
{
    unsigned n;
    cin >> n;
    cout << rabbit(n) << endl;
    return 0;
}
时间: 2024-08-13 14:54:21

【华为练习题 】 长寿的兔子的相关文章

【华为练习题】 最后一个单词的长度(初级)

[华为练习题] 最后一个单词的长度(初级) 题目 描述: 计算字符串最后一个单词的长度,单词以空格隔开. 题目类别: 字符串 输入: 一行字符串,长度小于128. 输出: 整数N,最后一个单词的长度. 样例输入: hello world 样例输出: 5 解答 #include <iostream> #include <string> using namespace std; int last_word_length(const string &s){ auto begin

【华为练习题】字符出现频率

[华为练习题]字符出现频率 题目 描述:写出一个程序,输出基准字符串中统计指定字符出现的频率 字符串仅包括英文大小写字母和空格.逗号.点号 小数点后保留2位有效数字,第三位四舍五入 举例: 输入:wo shi, yi zhi.xiao xiao niao ' '(空格) 输出:0.17 接口说明: /* 功能: 输入的基准字符串中统计指定字符出现的频率 字符串仅包括英文大小写字母和空格.逗号.点号 小数点后保留2位有效数字,第三位四舍五入 输入: String pString 输入的基准字符串

【华为练习题】乒乓球赛制

[华为练习题]乒乓球赛制 题目 国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及.其中11分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役.华华就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白11分制和21分制对选手的不同影响.在开展他的研究之前,他首先需要对他多年比赛的统计数据进行一些分析,所以需要你的帮忙. 华华通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在11分制和21分制下,双方的比赛结果(截至记录

【华为练习题】 爱因斯坦阶梯(初级)

[华为练习题] 爱因斯坦阶梯(初级) 题目 述: 爱因斯坦出了一道这样的数学题:有一条长阶梯,若每步跨2阶,则最最后剩一阶,若每步跨3 阶,则最后剩2阶,若每步跨5阶,则最后剩4阶,若每步跨6阶则最后剩5阶.只有每次跨7阶,最后才正好一阶不剩.请问这条阶梯共有多少阶? 分析 一个数满足除以2余1,除以3余2,除以5余4,除以6余5,那么这个数为2,3,5,6的最小公倍数减一. 解答 直接解法 #include "stdafx.h" #include <iostream> u

【华为练习题】 阿姆斯特朗数(初级)

[华为练习题] 阿姆斯特朗数(初级) 题目 如果一个正整数等于其各个数字的立方和,则该数称为阿姆斯特朗数(亦称为自恋性数),1除外,如407 = 4^3+0^3+7^3就是一个阿姆斯特朗数.试编程求n(n ≤ 65536)以内的所有阿姆斯特朗数. 原型: int CalcArmstrongNumber(int n); 输入参数: int n: n ≤ 65536 返回值: n以内的阿姆斯特朗数的数量 解答 #include <iostream> using namespace std; boo

【华为练习题】判断点是否在三角形中

[华为练习题]判断点是否在三角形中 题目 一个二维坐标系中(100*100,每一维0~99),已知三角形三个顶点的坐标A.B.C,判断坐标系中的任意点:P,是否在三角形内(在三角形边上也认为在三角形内) 请实现如下接口 /* 功能:点是否在三角形内 输入:三角形三顶点坐标:A.B.C,以及待确认的点:P 输出:无 返回:在三角形内返回true,否则返回false */ public static boolean isInTriangle(POINTA, POINTB, POINTC, POINT

【华为练习题】 求最大凸多边形(高级)

[华为练习题] 求最大凸多边形(高级) 题目 题目描述: 给定一些点,输出最大面积的凸边形.输出起始点为x轴最左边的点,按照顺时针方向输出,每个点必须是凸边形的顶点(不输出边上或凸边形内的点).输入第一个数n为坐标点个数,后面依次为n个坐标点的坐标,横坐标在前,不同坐标点用':'隔开,相同坐标点的横纵坐标用','隔开. 输入样例: 13;-4,1;-2,3;1,3;2,2;1,4;5,4;6,1;2,-4;-3,-3;1,-1;-2,-2;1,-2;-1,-1 输出样例: -4,1;-2,3;1

【华为练习题】用两个栈来模拟队列(中级)

[华为练习题]用两个栈来模拟队列(中级) 题目 栈的特点是后进先出,队列的特点是先进先出.所以,用两个栈S1和S2模拟一个队列时, 要求两个栈S1和S2的长度都是5. 要求实现以下函数: enQueue 将元素value插入队列,若入队列成功返回true,否则返回false deQueue 从队列中取出一个元素放入value,若出队列成功返回true,否则返回false. isEmptyQueue 判用队列是否为空,如果是空则返回true,如果不是空则返回false. 分析 S1作输入栈,逐个元

【华为练习题】约瑟夫问题拓展

[华为练习题]约瑟夫问题拓展 题目 功能: 约瑟夫问题众所周知,原始的约瑟夫问题是这样的:有n个人,编号为1,2,-, n,站成一圈, 每次第m个将会被处决,直到只剩下一个人.约瑟夫通过给出m来决定赦免其中的一个人. 例如当n=6,m=5时,5,4,6,2,3将会被依次处决,而1将会幸免. 假如有k个好人,和k个坏人,所有人站成一圈,前k个人是好人,后k个人是坏人, 编写程序计算一个最小的m,使k个坏人都被处决,而不处决任何好人. 输入: k 为正整数 输出: 返回: 最小的m,使k个坏人都被处