兔子繁殖

ming54864 2012-02-21 10:35:38
兔子具有很强的繁殖能力。一对成年兔子每个月可以繁殖一对小兔子,而一对小兔子经过m个月之后,就会长成一对成年兔子。通过分析,我们可以看出:若m=2的时候,每个月兔子的对数构成了一个Fibonacci数列。
但是,若m<>2,这个问题看起来就不那么简单了。你的任务是计算:假定初始只有一对兔子,那么,经过d个月之后,共有多少对兔子?可以假定,在此阶段没有任何兔子死亡。
【输入】
输入包括多组测试数据。每组测试数据的一行中包括2个整数m(1<=m<=10),d(1<=d<=30)。当测试数据遇到一行中有两个0时,即m=d=0,测试数据结束。
【输出】
针对每组测试数据,在每一行输出经过d个月后共有多少对兔子。
【输入样例】
2 3
3 5
0 0
【输出样例】
5
9


下面是我写的代码,我不知道错在那里了,希望能帮忙,
#include<iostream>
using namespace std;
class Node
{
private:
Node *next;
int month;
public:
friend class List;
Node(int m=1,Node *n=NULL):month(m),next(n){}

};
class List:public Node
{
private:
Node *head;
int size;
public:
List()
{
head=new Node(0,NULL);
head->next=new Node(0,NULL); //第一个是零岁的,因为后面是先把月加了再判断的
size=1;
}

void run(int n,int m)//总时间,要多少时间才能生仔
{
int i=0;
for(i=0;i<n;i++)
{
Node *p=head->next;
while(p)
{
p->month=p->month+1;
if(p->month>=m)
{
Node *q=new Node(1,NULL);//刚刚出生的,相当于一年过去了
q->next=head->next;
head->next=q;
p->month=p->month+1;
size++;
}

p=p->next;
}
}
cout<<size<<endl;
}
};
int main()
{
List l;
l.run(3,2);
}
...全文
703 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
aa_niaofang 2012-02-25
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 ming54864 的回复:]
引用 9 楼 aa_niaofang 的回复:

引用 8 楼 furney 的回复:
楼上的题目说了当m=2为斐波那契,但是当m!=2时再这样做就是错的啦


麻烦你看懂题目再 回答好不?

我也不知道怎么回事,我在算母牛生小牛的时候用那个函数就对,可是在这个兔子中就运行出的结果不一样
[/Quote]

你可以这样理解啊, 第n个月 总共的兔子总数 是 上个月的兔子总数 加上这 最近一个月新增加的兔子总数
这个月新增加的兔子总数 是m个月之前的 新的兔子总数,所以就是f(n)=f(n-1)+f(n-m),初始是一对成年兔
所以前k个 月k<m时 兔子数就是 经过的月数 也就是k个,由于是从0个月开始的,所以要k+1不知道 你数不对在什么地方,你可以用4 9 这样 写出来试试
j8daxue 2012-02-25
  • 打赏
  • 举报
回复
3,5输出9怎么个不对了?

这个很早做过的,大数写的烂,凑合看看
http://soj.me/viewsource.php?sid=713541
注意用迭代,别递归。或者递归保存结果,不必重复计算。
不过看这题数据根本不用大数
aa_niaofang 2012-02-25
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 ming54864 的回复:]
引用 9 楼 aa_niaofang 的回复:

引用 8 楼 furney 的回复:
楼上的题目说了当m=2为斐波那契,但是当m!=2时再这样做就是错的啦


麻烦你看懂题目再 回答好不?

我也不知道怎么回事,我在算母牛生小牛的时候用那个函数就对,可是在这个兔子中就运行出的结果不一样
[/Quote]

我写了个 测试的例子:

m=4 时 第i个月的 兔子对数 f(i)
====================================
i 0 1 2 3 4 5 6 7 8
-------------------------------------
f(i) 1 2 3 4 5 7 10 14 19
====================================

按照你给的两个 测试用例 我给出了他们的同样 的表
m=2 时 第i个月的兔子对数f(i),这里请注意 与fibonacci还是有不同的 fibonacci是以一对幼兔开始的 所以他的 f(5)=f(4)+f(3)=2f(3)+f(2)=5f(1)+3f(0)=8,而不是你给出的例子中的5,前面说过推论原因是你这里是以一对成年兔开始的,但愿你不是由于这种原因说不符合,如果可以贴出你的所有测试用例
=====================================
i 0 1 2 3 4 5 6 7 8 9
-------------------------------------
f(i) 1 2 3 5 8 13 21 34 55 89
=====================================

下面就是m=3 时的情况
=====================================
i 0 1 2 3 4 5 6 7 8 9
-------------------------------------
f(i) 1 2 3 4 6 9 13 19 28 41
=====================================

静待回帖,实在没想到 这么简单的问题 居然错了 望贴出详细的信息
ming54864 2012-02-25
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 j8daxue 的回复:]

3,5输出9怎么个不对了?

这个很早做过的,大数写的烂,凑合看看
http://soj.me/viewsource.php?sid=713541
注意用迭代,别递归。或者递归保存结果,不必重复计算。
不过看这题数据根本不用大数
[/Quote]谢谢你了
ming54864 2012-02-25
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 aa_niaofang 的回复:]

引用 12 楼 ming54864 的回复:
引用 9 楼 aa_niaofang 的回复:

引用 8 楼 furney 的回复:
楼上的题目说了当m=2为斐波那契,但是当m!=2时再这样做就是错的啦


麻烦你看懂题目再 回答好不?

我也不知道怎么回事,我在算母牛生小牛的时候用那个函数就对,可是在这个兔子中就运行出的结果不一样


我写了个 测试的例子:

m=……
[/Quote]太谢谢你们了
aa_niaofang 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 furney 的回复:]
楼上的题目说了当m=2为斐波那契,但是当m!=2时再这样做就是错的啦
[/Quote]

麻烦你看懂题目再 回答好不?
ming54864 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 aa_niaofang 的回复:]

引用 8 楼 furney 的回复:
楼上的题目说了当m=2为斐波那契,但是当m!=2时再这样做就是错的啦


麻烦你看懂题目再 回答好不?
[/Quote]
我也不知道怎么回事,我在算母牛生小牛的时候用那个函数就对,可是在这个兔子中就运行出的结果不一样
ming54864 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 aa_niaofang 的回复:]

写错了 日
C/C++ code

int fun(int m, int n)
{
if (m > n)
return (n + 1);
else
return f(m,n-1)+f(m,n-m);
}
[/Quote]
运行结果不对,就是输入3,5时你的代码得9,
随便说下,这个题目是一个竞赛题,不要看我那个链表的代码,链表代码是我自己写的,我运行不对了,题目我都复制完了
ming54864 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 j8daxue 的回复:]

引用 3 楼 ming54864 的回复:
引用 2 楼 j8daxue 的回复:

既然都提示了m=2为斐波那契,不知道写个链表做什么?
递推公式为f(n) = f(n-1) + f(n-m);

我也是过了用你那个方法,可是不对,
int fun(int n,int m)
{
int i = 0 ;
if(n<1) i = 0;
if(n>=1&amp;&……
[/Quote]
就是算出那个答案和给的不一样,所以我才用问下的
Furney 2012-02-23
  • 打赏
  • 举报
回复
楼上的题目说了当m=2为斐波那契,但是当m!=2时再这样做就是错的啦
aa_niaofang 2012-02-23
  • 打赏
  • 举报
回复
写错了 日

int fun(int m, int n)
{
if (m > n)
return (n + 1);
else
return f(m,n-1)+f(m,n-m);
}

aa_niaofang 2012-02-23
  • 打赏
  • 举报
回复
代码没对齐 我勒个去 比较。。。的我 不得不重贴份

int fun(int m, int n)
{
if (m > n)
return (n + 1);
else
return f(m,n-1)+f(n,n-m);
}
aa_niaofang 2012-02-23
  • 打赏
  • 举报
回复
题目是含糊不清的 经过推理 将题目明确如下
首先开始是一对成年兔子,且是以第0个月开始记得

代码如下:
lisp

(define (f m d)
(if (> m d)
(+ d 1)
(+ (f m (- d 1))
(f m (- d m)))))



c版

int fun(int m, int n)
{
if (m > n)
return (n + 1);
else
return f(m,n-1)+f(n,n-m);
}
j8daxue 2012-02-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ming54864 的回复:]
引用 2 楼 j8daxue 的回复:

既然都提示了m=2为斐波那契,不知道写个链表做什么?
递推公式为f(n) = f(n-1) + f(n-m);

我也是过了用你那个方法,可是不对,
int fun(int n,int m)
{
int i = 0 ;
if(n<1) i = 0;
if(n>=1&&n<=m) i = 1;
if……
[/Quote]
wrong answer?
ming54864 2012-02-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 j8daxue 的回复:]

既然都提示了m=2为斐波那契,不知道写个链表做什么?
递推公式为f(n) = f(n-1) + f(n-m);
[/Quote]
我也是过了用你那个方法,可是不对,
int fun(int n,int m)
{
int i = 0 ;
if(n<1) i = 0;
if(n>=1&&n<=m) i = 1;
if(n>m) i = fun(n-m,m)+fun(n-1,m);
return i;
}
j8daxue 2012-02-22
  • 打赏
  • 举报
回复
既然都提示了m=2为斐波那契,不知道写个链表做什么?
递推公式为f(n) = f(n-1) + f(n-m);
ming54864 2012-02-22
  • 打赏
  • 举报
回复
怎么没有人的?

64,637

社区成员

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

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