C++编程,小白鼠问题

kingtoucher 2012-04-05 02:38:32
有一家生化所,一月份引入一对新生的小白鼠。这对小白鼠生长两个月后,在第三、第四、第五个月各繁殖一对新小白鼠,在第六个月停止繁殖,在第七个月则死亡。新生的小白鼠也如此繁殖。问在第N个月时,活的小白鼠有多少对?

谁帮我说说思路,把问题具体化一些,我想不出思路,很乱感觉.....能给我代码就更好了,谢谢
...全文
581 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
某大一菜鸟 2012-04-19
  • 打赏
  • 举报
回复
现提供一个算法,时间复杂度为O(n):

1. 首先定义一个RabbitSet结构,包含成员LifeTime(表示剩余生存月数,初始为7),N(对数)。这个结构是同一月出生的N对兔子的抽象集合

2.
funtion Counter(TotalMonth)
新建一个链表List
新建一个RabbitSet对象FirstRabbit
List.pushback(FirstRabbit)

while(TotalMonth > 0)
新建一个RabbitSet对象ThisRabbitSet
对List内LifeTime满足生育条件的RabbitSet对象,读取其数据成员N,使ThisRabbit.N += N;遍历的同时使各RabbitSet的LifeTime自减
从List头部清出List中LifeTime为0的RabbitSet
List.pushback(ThisRabbitSet)

最后遍历List,求出各RabbitSet对象的N值的总和即可




setidfine 2012-04-19
  • 打赏
  • 举报
回复
递归啦
  • 打赏
  • 举报
回复
呵呵 17L 牛人
kobemadi 2012-04-19
  • 打赏
  • 举报
回复
楼上的写得很清晰啊,厉害
Fergon 2012-04-19
  • 打赏
  • 举报
回复
用模板看得就眼花,这个好多了:
#include <iostream>
int mouse(int m){
return
m <= 0 ? 0
: m == 1 || m ==2 ? 1
: m==7 ? mouse(m-1)+mouse(m-2)- 2
: mouse(m-1)+mouse(m-2) - mouse(m-5);

}

int main(){
const int month = 10;
std::cout << month <<"月份存活数: "<<mouse(month);
}
ken_scott 2012-04-19
  • 打赏
  • 举报
回复
居然为个算法写了个类, 头一次, 汗...
ken_scott 2012-04-19
  • 打赏
  • 举报
回复
思路:
第N个月的对数 就是 第N-1月时 1-5个月(当时的1-5)的对数 加上 下一个月就要出生的,而当时6个月的会在这个月死亡,故不用考虑
代码:

#include <cassert>
#include <vector>
#include <iostream>
using namespace std;

int get_count(int n);

class pairs_state /* sigleton */
{
private:
pairs_state()
{
count_of_month[0] = 1; /* sum */
count_of_month[1] = 1;
count_of_month[2] = 0;
count_of_month[3] = 0;
count_of_month[4] = 0;
count_of_month[5] = 0;
count_of_month[6] = 0;
count_of_month[7] = 0; /* alive for 7 months, always 0 */
}

pairs_state & operator ++ ()
{
int count_of_birth = count_of_month[2];
count_of_birth += count_of_month[3];
count_of_birth += count_of_month[4];

count_of_month[0] = 0;
for (int i = 6; i > 1; --i) {
count_of_month[i] = count_of_month[i-1];
count_of_month[0] += count_of_month[i];
}
count_of_month[1] = count_of_birth;
count_of_month[0] += count_of_month[1];
}

int sum() const
{
return(count_of_month[0]);
}

friend int get_count(int);

private:
pairs_state(const pairs_state &);
pairs_state & operator = (const pairs_state &);

private:
int count_of_month[8];
};

int get_count(int n)
{
assert(n > 0);

static pairs_state state;
static vector<int> count;

for (int i = count.size(); i < n; ++i) {
count.push_back(state.sum());
++state;
}

return(count[n-1]);
}

int main(void)
{
for (int i = 10; i > 0; --i) {
cout << "month " << i << ", pairs: " << get_count(i) << endl;
}
return(0);
}

另外, 我把它写到我的博客上去了, :-)
Fergon 2012-04-19
  • 打赏
  • 举报
回复



template<const int N>
int mouse()
{


return mouse<N-1>() + mouse<N-2>() - mouse<N-5>();

}

template<>
int mouse<0>(){
return 1;
}

template<>
int mouse<1>(){
return 1;
}

template<>
int mouse<2>(){
return mouse<1>()+1 ;
}
template<>
int mouse<3>(){
return mouse<2>()+1;

}
template<>
int mouse<4>(){

//除了昨天新生的baby不会生子,其它的都会在今天生。
//因为 昨天的baby = mouse<3>() - mouse<2>();所以今天总数为 mouse<3>() *2 - (mouse<3>() - mouse<2>() );
//化简为
return mouse<3>() +mouse<2>();
}

template<>
int mouse<5>(){
return mouse<4>() + mouse<3>() - 1; //一个绝育了。
}

template<>
int mouse<6>(){
return mouse<5>() + mouse<4>() - 1 - 1; //死掉一个;绝育一个。
}


#include <iostream>

int main(){

const int n = 18;
std::cout <<std::endl<< n << "月份存活数:"
<<mouse<n-1>() ;

}
Fergon 2012-04-19
  • 打赏
  • 举报
回复
还是递归舒服些吧。

template<const int N>
int mouse()
{


return mouse<N-1>() + mouse<N-2>() - mouse<N-5>();

}

template<>
int mouse<0>(){
return 1;
}

template<>
int mouse<1>(){
return 1;
}

template<>
int mouse<2>(){
return mouse<1>()+1 ;
}
template<>
int mouse<3>(){
return mouse<2>()+1;

}
template<>
int mouse<4>(){

//除了昨天新生的baby不会生子,其它的都会在今天生。
//因为 昨天的baby = mouse<3>() - mouse<2>();所以今天总数为 mouse<3>() *2 - (mouse<3>() - mouse<2>() );
//化简为
return mouse<3>() +mouse<2>();
}

template<>
int mouse<5>(){
return mouse<4>() + mouse<3>() - 1; //一个绝育了。
}

template<>
int mouse<6>(){
return mouse<5>() + mouse<4>() - 1 - 1; //死掉一个;绝育一个。
}


#include <iostream>

int main(){

const int n = 18;
std::cout <<std::endl<< n << "月份存活数:"
<<mouse<n-1>() ;

}
某大一菜鸟 2012-04-19
  • 打赏
  • 举报
回复
这个问题果断不可能用递归做,时间复杂度不允许..
byijie 2012-04-18
  • 打赏
  • 举报
回复
3个数a,b,c分别代表总数,不可进行繁殖数,死亡数
分别初始化为2,2,2
分情况1-5月
不考虑不可进行繁殖数及死亡数,对总数进行累加
从第6月开始,考虑不可繁殖数,并从总数中减去不可繁殖数后乘以二,积累到总数中,不可繁殖数自乘2
从第7月开始,考虑死亡数,并从总数中减去死亡数并赋值,从总数中减去不可繁殖数后乘以2,积累到总数中,不可繁殖数自乘2,死亡数自乘2。


我就是按时间顺序考虑的,不知道我对题目的理解正确不?
kingtoucher 2012-04-17
  • 打赏
  • 举报
回复
还有高手没?来帮忙啊
muyi66 2012-04-05
  • 打赏
  • 举报
回复
递归会有两种不同的方式,不过我觉得都不如迭代好。这个问题真不适合用递归。
lyj2009 2012-04-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

比斐波那契的兔子问题复杂了很多:

新出生的数量 New[i]=New[i-2]+New[i-3]+New[i-4]
第i月的总数 Sum[i]=Sum[i-1]+New[i]-New[i-6]

相比之下斐波那契的算法简单太多了。
[/Quote]
我主要是用了3楼的思路,写成8楼是错了。

我很好奇怎么用递归解决这个问题。

求递归代码。
cbzjzsb123 2012-04-05
  • 打赏
  • 举报
回复
muyi66 2012-04-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

C/C++ code
#include <stdio.h>

int main(int argc, char *argv[])
{

unsigned int New[10] = {0,0,0,0,0,0,0,0,0,0};
unsigned int Sum[2] = {0,0};
int i;
New[0] = 1;
Sum[0] = 1;
……
[/Quote] Sum[0]=New[0] = 2;
从一对开始,这样就可以了。写成8楼那样会多出一倍来。
另一个方法是在输出时再加倍,也能正确表达。
lyj2009 2012-04-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

用递归解决
[/Quote]
为什么要用递归。我这个方法效率也不错,也不占内存。
lyj2009 2012-04-05
  • 打赏
  • 举报
回复
如果新生一对的话,
New[(i&7)] = (New[((i-2)&7)] + New[(i-3)&7] + New[((i-4)&7)])* 2;
WZZZ123 2012-04-05
  • 打赏
  • 举报
回复
用递归解决
lyj2009 2012-04-05
  • 打赏
  • 举报
回复
#include <stdio.h>

int main(int argc, char *argv[])
{

unsigned int New[10] = {0,0,0,0,0,0,0,0,0,0};
unsigned int Sum[2] = {0,0};
int i;
New[0] = 1;
Sum[0] = 1;
printf("%d \n\r",1);
for(i = 1;i <20;i++)
{
New[(i&7)] = New[((i-2)&7)] + New[(i-3)&7] + New[((i-4)&7)];
Sum[(i&1)] = Sum[(i-1)&1] + New[(i&7)] - New[((i-6)&7)];
printf("%d \n\r",Sum[(i&1)]);
}

return 0;
}
加载更多回复(5)
I made this file by collecting kinds of paper test information online in about half a year. I made it public to help the ones hunting for jobs like myself last year. If anything is wrong, Please contact me by CSDN or Peking Moment at gmail dot com. You can print or note this file by yourself without纸上谈兵 刖音……… 操作系统及 linux 14 1.进程与线程 1)同步机伟 14 2)进程通信… 15 3)同步与通信 4)进程调度 16 5)多进程与多线程的区别….17 6)死锁 17 7〕)进程与线程 18 2. fork ““““““““““““““ 18 3. Linux…………… 20 4, RAID 21 5.测试…. 1面 道面准 21 6.堆栈数据代码区 …22 7.文件读写 n1道面1面面主B1 23 1) fclose(……… 23 2)fopen 23 3fseek0 .24 4)fread 24 5) fwrite(… 24 8.硬链接与软链接 25 .C++与面向对象语言 26 1.C语言基础问题… 26 GoogLe+@http://dwz.cn/fada5 CsdN@http://dwz.cn/as2ik 1)关于 const的问题 26 2)浅复制与深复制.…. 3)逆波兰表达式 4)C语言变长参数0 a品 27 5)调用约定… 27 6)寄存器 28 7)关于内联数 inline 28 8 PACK.... 28 9)正则表达式 29 内存操作… 29 11)四种强制类型转换 31 12 sizeof …31 13)动态库与静态库 32 14)压栈·优先级·位序·宏· Union·指针 32 15)new& malloc… 35 16) enum 35 2.面冋对象编程 面面面 35 1)构造函数虚函数静态成员函数…… 35 2)copy& assignment… 36 3)列表初始化 37 4)多态… 37 5)静态绑定与动态绑定 38 6 Explicit mutable volatile internal 39 7)继承… 39 8〕)堆栈溢出 面主1面主面:aat 40 9)重载操作符 40 10) Final 1 C+ 41 3.设计模式. .41 1)UTF编码协议… 41 〕)创建型模式( creational pattern)…… 41 3)单例模式 1面a i1面 42 4)策略模式…… 主主主基主主主主 42 5)MVC……, 43 6) PIMPL….... “4 .43 7)RAIL 44 4 STL 44 1) Vector.… 44 2]upper_ bound&lower_bound 45 mAp 45 数据结构 46 1.树. 146 1)基本知识 …46 2)几个问题 46 3)完全二叉树( Complete binary tree)… 54 4)次优查找树 55 5)最优二叉树霍大曼树…… 55 6) BST: Search/insert/delete 56 7)平衡二叉树与AVL树 8)B树与B+树 57 9)红黑树 59 2.栈 59 GoogLe+@http://dwz.cn/fada5 Csdn@http://dwz.cn/as2ik 1)括号配对 59 3.链表… 61 1)单向链表交点问题 61 2)链表内环的存在间题 62 3)链表逆置反向存储… 63 4)将两个排序好的链表归并 4.图. 面道盖 主1 65 1)某本知识….,… 65 2)图的表示…, 1面自1主主主日1面主 65 )DFS&BFS…....… 6 4D&b&FW algorithm 68 5)应用 主自 着面 69 5.排序 70 1)基木知识 …70 2)快速排序 …71 3)插入排序 72 4)希尔排序… …72 5)选择排序 72 6)归并排序… 73 7)堆排序 74 8)拓扑排序… 75 9)计数排序… 76 6. Hash 76 1) Consistent Hashing…… 76 7.查找元素∴ 77 1)一般二分查找…… 77 2)循环升序数组 77 3)杨氏矩阵… 4)跨行查找字符串 81 5)Trie树 81 8.其他. 1)主定理与复杂度 81 2)静态存储与动态存储… 82 3)字符串匹配 主主面主主主 ….82 四 数据与计算机通信… 85 1 OSI 85 2.TCP协议 85 1.通路的建立 .86 2.数据传输 86 3.连接终止 87 4.拥塞控制 88 5. Soket通讯与TCP原语 88 3.UDP协议… 89 4.分组交换 90 5.HTTP协议… 90 1)TTP协议简介 2)HTTP协议方法 90 3)HT"TP响应,,…,,… 1 4)示例 91 6.IP协议… 92 1)IPv4 92 2)子网划分 92 GoogLe+@http://dwz.cn/fada5 Csdn@http://dwz.cn/as2ik 7. ICMP 93 8.ARP与RARP 93 数据库 94 1.主键/超键/候选键. 94 2 ACID 1面主 …94 3.数据库范式… n010000I 94 4.数据库中的基本语句 11面 95 5.游标 …………95 6.索引 主主主 主主基主主主主主主签主主主 95 7.语句 96 8.内连接与外连接 96 9.视图 96 六.算法及智力题目 97 1.小白鼠试毒问题及扩展… 主面⊥ 自11自主 97 2.大半寻找次品球问题及扩展. 主主主在主主 97 3.抽扑克牌问题. 98 4.三密码锁问题…… 面面面 99 5.猜数字问题 99 6.最大连续子序列问题 100 7.优惠券问题 101 8.闫隔翻眼镜问题.… …102 9.扔鸡蛋确定楼层问题..-. 02 10.左上右下最大流问题 106 11.三角形内产生随机数 111 12.赛与问题 …111 13.过河问题〔 intel)… 113 14.数星星问题.… 114 15.交流问题/ Gossip problem 114 16.交换问题. 15 17.换数… 18.消耗问题…… 117 19.四则算式 17 20.国王与魔鬼下棋问题 11面 121 七.数学与逻辑…… 122 1.停时定理 122 2.基本公式 123 3.实现'a+b 123 4.估算N!的位数.0 123 5.N的开方 124 6.三个数组求最大距离 126 7.6,9,140可以组合成大于N的所有数请问N最小为?…126 8.判断一个点位于一个多边形的内部? 126 9.求连续数组的最大乘积 127 10.台阶接水问题. 127 11.最小交集. 127 12.概率问题 127 1)生日悖论之二 127 2〕)升级概率问题 128 3)碰撞概率…,… 128 4)布丰投针问题,…,,… …128 )概率组合示例….129 13.排列组合问题 130 GoogLe+@http://dwz.cn/fada5 CsdN@http://dwz.cn/as2ik 1)组合 130 2)全排列 130 3)错排问题..0 133 4)输入,输出对应的所有长度为的二进制串 134 5)输入56,输出11-1621-26…51-56… 135 6)已知字符串里的字符是互不相同的,现在任意组合,比如ab,则输出a, ab,ba,bb,编程接照字典序输出所有的组合 .136 八.手写代码. 138 1. strcpy函数…,,,,, 面面1a面 …138 2.atoi.…, 自1面 主主道 138 3.itoa(Intel) 139 4.约慭夫环〔nte) 面111面D面主 139 5.二分查找函数 140 6.实现栈或者树的建立查找删除销毁操作… 141 7.斐波那契数列 141 8.求两个数组中的相同元素 141 9.查找一个中间大的数… 141 10.编写类 String的构造析构赋值函数…,…,…,,, 141 11.输入两个宇符串,输出第二个字符串在第一个字符串中的位序 143 12.方块寻径…… …144 13.实现积分图 145 语…… 146

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧