同学的同学问了这样一个问题:

有一对小老鼠,出生一周后长成一对大老鼠,两周后这对老鼠生出第一对小老鼠,三周后上周出生的小老鼠变成大老鼠,而原来的大老鼠又生出了一对小老鼠之后便死了,四周后,第一对出生的小老鼠(此时已经是大老鼠)又生出了一对小老鼠,此时共有三对老鼠。编程,计算N周后有多少对老鼠?

首先,这个问题如果小鼠没有死亡,就是一个典型的斐波那契数列(事实上斐波那契数列最早就是描述兔子繁殖的)

加上死亡,就需要重新考虑一下了~

方法一:

  自然是超级水的同时很管用的----找规律法。

周数  0-----1-----2-----3-----4-----5-----6-----7.............

鼠数  1-----1-----2-----2-----3-----4-----5-----7.............

很容易就发现,相邻两个的和是隔一周的数,比如:2周和3周的和是5周,4周和5周的和是7周。

所以递归之:

 1 #include <iostream>
 2
 3 using namespace std;
 4
 5 int mouse(int n)
 6 {
 7     if (0 == n)
 8     {
 9         return 1;
10     }
11     else if (1 == n)
12     {
13         return 1;
14     }
15     else if (2 == n)
16     {
17         return 2;
18     }
19     else
20     {
21         return mouse(n-2)+mouse(n-3);
22     }
23 }
24
25 int main()
26 {
27     int n;
28
29     while (cin >> n)
30     {
31         cout << mouse(n) << endl;
32     }
33
34     return 0;
35 }

方法二:

  递归太慢了,而且对于这个问题,显然没复杂到只能用递归。

  第二个方法就是手动模拟整个繁殖过程,开个数组存不同年龄段的老鼠。也就是改成用递推做~

 1 #include <iostream>
 2
 3  using namespace std;
 4
 5  int num(int);
 6
 7  int main()
 8  {
 9      int n;
10      while (cin >> n)
11      {
12          cout << "The answer is " << num(n) << endl;
13      }
14
15
16      return 0;
17  }
18
19  int num(int n)
20  {
21      int a[3] = {1, 0, 0};
22      int t1, t2;
23
24      for (int i=0; i<n; ++i)
25      {
26          t1 = a[1];
27          t2 = a[2];
28          a[1] = a[0];
29          a[2] = t1;
30          a[0] = t1 + t2;
31
32          cout << i+1 << " has " << (a[0]+a[1]+a[2]) << " mice" << endl;
33      }
34      return (a[0]+a[1]+a[2]);
35  }

================================================================

又有下文了,同学的同学的老师说要大数也能处理的。

补充一个:

 1 #include <iostream>
 2 #include <cstring>
 3
 4 const int MAX = 100000;
 5
 6 using namespace std;
 7
 8 void add(char *str1, char *str2, char *str3);
 9 void num(int, char *);
10
11 int main()
12 {
13     int n;
14     char s[MAX];
15
16     while (cin >> n)
17     {
18         num(n, s);
19         cout << "The answer is " << s << endl;
20     }
21
22
23     return 0;
24 }
25
26 void num(int n, char *s)
27 {
28     //Big Int
29     char a0[MAX];
30     char a1[MAX];
31     char a2[MAX];
32     char t1[MAX];
33     char t2[MAX];
34
35     strcpy(a0, "1");
36     strcpy(a1, "0");
37     strcpy(a2, "0");
38
39     for (int i=0; i<n; ++i)
40     {
41         strcpy(t1, a1);
42         strcpy(t2, a2);
43         strcpy(a1, a0);
44         strcpy(a2, t1);
45         add(t1, t2, a0);
46     }
47     char temp1[MAX];
48     char temp2[MAX];
49     char temp3[MAX];
50     strcpy(temp1, a0);
51     add(temp1, a1, temp2);
52     add(temp2, a2, temp3);
53     strcpy(s, temp3);
54 }
55
56 void add(char *str1, char *str2, char *str3)
57 {
58     int i, j, i1, i2, tmp, carry;
59     int len1 = strlen(str1);
60     int len2 = strlen(str2);
61     char ch;
62
63     i1 = len1 - 1;
64     i2 = len2 - 1;
65     j = carry = 0;
66
67     for ( ; i1>=0 && i2>=0; ++j, --i1, --i2)
68     {
69         tmp = str1[i1] - '0' + str2[i2] - '0' + carry;
70         carry = tmp / 10;
71         str3[j] = tmp % 10 + '0';
72     }
73     while (i1 >= 0)
74     {
75         tmp = str1[i1--] - '0' + carry;
76         carry = tmp/10;
77         str3[j++] = tmp%10 + '0';
78     }
79     while (i2 >= 0)
80     {
81         tmp = str2[i2--] -'0' + carry;
82         carry = tmp/10;
83         str3[j++] = tmp%10 + '0';
84     }
85
86     if (carry)
87     {
88         str3[j++] = carry + '0';
89     }
90     str3[j] = '\0';
91
92     for (i=0, --j; i<j; ++i, --j)
93     {
94         ch = str3[i];
95         str3[i] = str3[j];
96         str3[j] = ch;
97     }
98 }

转载于:https://www.cnblogs.com/RootJie/archive/2012/06/11/2545509.html

老鼠繁殖问题(老鼠有死亡)相关推荐

  1. 1000瓶水其中有一瓶水有毒,有10只老鼠并且只要老鼠喝了有毒的水必死。请问怎样通过一次实验找出有毒的那瓶水。

    1000瓶水其中有一瓶水有毒,有10只老鼠并且只要老鼠喝了有毒的水必死.请问怎样通过一次实验找出有毒的那瓶水. . 这道题知识点:二进制. 解题思路:2的10次方等于1024,1024以内的所有自然数 ...

  2. 面试题:1000瓶水其中有一瓶水有毒,有10只老鼠并且只要老鼠喝了有毒的水必死。请问怎样通过一次实验找出有毒的那瓶水。

    面试题:1000瓶水其中有一瓶水有毒,有10只老鼠并且只要老鼠喝了有毒的水必死.请问怎样通过一次实验找出有毒的那瓶水. 1.  知识点:二进制. 解题思路:此题考察的是二进制.2的10次方等于1024 ...

  3. 老鼠实验中老鼠的数量变化曲线

  4. 老鼠识别 yolo老鼠识别 深度学习老鼠识别 仓鼠识别 名厨亮灶

    自建数据集训练的模型 效果棒棒哒 深度学习算法 yolov3训练 keras版本 tf版本 c++版本 效果如下

  5. 有 3 只老鼠,8 瓶水,其中一瓶有毒,喝到有毒的水之后,老鼠一周后会准时死亡。...

    题目 有 3 只老鼠,8 瓶药,其中一瓶有毒,喝到有毒的药之后,老鼠一周后会准时死亡.按照要求,写个算法,如何在一周内找出哪瓶有毒.(以程序语言实现,语言不限.) 基本思路 给瓶子编号 0-7,并把编 ...

  6. 扫地机器人粘住老鼠板怎么办_家里老鼠的危害性及如何有效灭鼠

    鼠害是一年四季都会发生的.冬季寒冷,老鼠会通过各种渠道进入到室内过冬,因此防鼠最重要的还是保持室内整洁,家里不要堆积物品,让老鼠无藏身之处. 在我们所居住的城市生活区,经常能看到老鼠逃跑的踪迹,老鼠繁 ...

  7. 1000瓶水有1瓶水有毒,老鼠喝一滴就会死,但是需要一周毒发,请问最少需要多少老鼠多少时间才能找到那瓶有毒的水。

    1000瓶水有1瓶水有毒,老鼠喝一滴就会死,但是需要一周毒发,请问最少需要多少老鼠多少时间才能找到那瓶有毒的水. 这个题是对bit位的应用,1000接近1024,所以对1000瓶水编号需要10个bit ...

  8. 算法:挑选出100瓶药水中有且仅有1瓶毒药水所需的最少老鼠数量?

    挑选出100瓶药水中有且仅有1瓶毒药水所需的最少老鼠数量? 问题描述 100 瓶水其中有一瓶有毒,用老鼠试毒老鼠试后 7 天会死掉,需要多少只老鼠才能试出哪瓶水有毒? 题目解析 第一步:编码 给这 1 ...

  9. 二进制老鼠毒药c语言,老鼠试药  二进制问题

    简化一下:如果只有8瓶,至少需要几只老鼠??? 药水瓶编号是000 001 010 011 100 101 110 111, 三位二进制w1.w2.w3 三只老鼠是c1.c2.c3, 老鼠c1.c2. ...

最新文章

  1. mysql join union_MySQL中union和join语句使用区别的辨析教程
  2. hash table(开放寻址法-线性探查实现的哈希表)
  3. 浅谈c++中结构体和共用体的区别
  4. python笑傲江湖统计字数_Udacity.深度学习.用 Python 统计字数.2017-10-30
  5. pytorch常见错误(持续更新)
  6. 写一篇文章需要多长时间?
  7. android 主流应用,android应用推广系列(一):国内几个google主流应用市场介绍
  8. SQL语句设置标识种子
  9. 【Web开发】HTML颜色代码表
  10. 简单有效的记录日常收支
  11. Outlook 365 添加企业Exchange邮箱(亲测)
  12. 互联网 年龄歧视_太老了,无法玩:年龄歧视和游戏
  13. ios系统更新怎样用移动网络连接服务器,苹果手机用不了蜂窝数据?用这几招解决!...
  14. CTF中遇到不知道文件类型_在营销界碰到网易,你永远不知道会遇到什么惊喜……...
  15. 3d智慧城市线上3d模型展示可视化平台
  16. MySql基础语法-java学习
  17. 我的世界1.6.4java下载_我的世界Java版1.16.4
  18. Simultaneous Detection and Segmentation
  19. java学生成绩管理_java开发的简易学生成绩管理系统
  20. 程序员都会用到的13个Spring MVC实用技巧,收藏!!!

热门文章

  1. 秦岭NDVI动态格局
  2. iOS:如何在iphone、ipad上安装一些常用命令行命令
  3. 我们对汽车黑客,CIA和维基解密声称的了解
  4. 程序访问中什么是临界区
  5. 【蓝桥杯】 算法训练 旅行家的预算
  6. html里怎么计算梯形周长公式是什么,梯形的周长公式是什么
  7. Linux使用技巧6--Ubuntu笔记本屏幕亮度调节
  8. 室内设计优美语句_描写家居的优美句子
  9. 宝塔Nginx环境安装pagespeed模块加速网站以及配置WebP格式图片加速方法
  10. CTFHub | bak文件