老鼠繁殖问题(老鼠有死亡)
同学的同学问了这样一个问题:
有一对小老鼠,出生一周后长成一对大老鼠,两周后这对老鼠生出第一对小老鼠,三周后上周出生的小老鼠变成大老鼠,而原来的大老鼠又生出了一对小老鼠之后便死了,四周后,第一对出生的小老鼠(此时已经是大老鼠)又生出了一对小老鼠,此时共有三对老鼠。编程,计算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
老鼠繁殖问题(老鼠有死亡)相关推荐
- 1000瓶水其中有一瓶水有毒,有10只老鼠并且只要老鼠喝了有毒的水必死。请问怎样通过一次实验找出有毒的那瓶水。
1000瓶水其中有一瓶水有毒,有10只老鼠并且只要老鼠喝了有毒的水必死.请问怎样通过一次实验找出有毒的那瓶水. . 这道题知识点:二进制. 解题思路:2的10次方等于1024,1024以内的所有自然数 ...
- 面试题:1000瓶水其中有一瓶水有毒,有10只老鼠并且只要老鼠喝了有毒的水必死。请问怎样通过一次实验找出有毒的那瓶水。
面试题:1000瓶水其中有一瓶水有毒,有10只老鼠并且只要老鼠喝了有毒的水必死.请问怎样通过一次实验找出有毒的那瓶水. 1. 知识点:二进制. 解题思路:此题考察的是二进制.2的10次方等于1024 ...
- 老鼠实验中老鼠的数量变化曲线
- 老鼠识别 yolo老鼠识别 深度学习老鼠识别 仓鼠识别 名厨亮灶
自建数据集训练的模型 效果棒棒哒 深度学习算法 yolov3训练 keras版本 tf版本 c++版本 效果如下
- 有 3 只老鼠,8 瓶水,其中一瓶有毒,喝到有毒的水之后,老鼠一周后会准时死亡。...
题目 有 3 只老鼠,8 瓶药,其中一瓶有毒,喝到有毒的药之后,老鼠一周后会准时死亡.按照要求,写个算法,如何在一周内找出哪瓶有毒.(以程序语言实现,语言不限.) 基本思路 给瓶子编号 0-7,并把编 ...
- 扫地机器人粘住老鼠板怎么办_家里老鼠的危害性及如何有效灭鼠
鼠害是一年四季都会发生的.冬季寒冷,老鼠会通过各种渠道进入到室内过冬,因此防鼠最重要的还是保持室内整洁,家里不要堆积物品,让老鼠无藏身之处. 在我们所居住的城市生活区,经常能看到老鼠逃跑的踪迹,老鼠繁 ...
- 1000瓶水有1瓶水有毒,老鼠喝一滴就会死,但是需要一周毒发,请问最少需要多少老鼠多少时间才能找到那瓶有毒的水。
1000瓶水有1瓶水有毒,老鼠喝一滴就会死,但是需要一周毒发,请问最少需要多少老鼠多少时间才能找到那瓶有毒的水. 这个题是对bit位的应用,1000接近1024,所以对1000瓶水编号需要10个bit ...
- 算法:挑选出100瓶药水中有且仅有1瓶毒药水所需的最少老鼠数量?
挑选出100瓶药水中有且仅有1瓶毒药水所需的最少老鼠数量? 问题描述 100 瓶水其中有一瓶有毒,用老鼠试毒老鼠试后 7 天会死掉,需要多少只老鼠才能试出哪瓶水有毒? 题目解析 第一步:编码 给这 1 ...
- 二进制老鼠毒药c语言,老鼠试药 二进制问题
简化一下:如果只有8瓶,至少需要几只老鼠??? 药水瓶编号是000 001 010 011 100 101 110 111, 三位二进制w1.w2.w3 三只老鼠是c1.c2.c3, 老鼠c1.c2. ...
最新文章
- mysql join union_MySQL中union和join语句使用区别的辨析教程
- hash table(开放寻址法-线性探查实现的哈希表)
- 浅谈c++中结构体和共用体的区别
- python笑傲江湖统计字数_Udacity.深度学习.用 Python 统计字数.2017-10-30
- pytorch常见错误(持续更新)
- 写一篇文章需要多长时间?
- android 主流应用,android应用推广系列(一):国内几个google主流应用市场介绍
- SQL语句设置标识种子
- 【Web开发】HTML颜色代码表
- 简单有效的记录日常收支
- Outlook 365 添加企业Exchange邮箱(亲测)
- 互联网 年龄歧视_太老了,无法玩:年龄歧视和游戏
- ios系统更新怎样用移动网络连接服务器,苹果手机用不了蜂窝数据?用这几招解决!...
- CTF中遇到不知道文件类型_在营销界碰到网易,你永远不知道会遇到什么惊喜……...
- 3d智慧城市线上3d模型展示可视化平台
- MySql基础语法-java学习
- 我的世界1.6.4java下载_我的世界Java版1.16.4
- Simultaneous Detection and Segmentation
- java学生成绩管理_java开发的简易学生成绩管理系统
- 程序员都会用到的13个Spring MVC实用技巧,收藏!!!