老鼠繁殖问题(兔子问题的典型例题)

要求c语言实现
有一对小老鼠,出生一周后长成一对大老鼠,两周后出生第一对小老鼠,三周后,上周出生的小老鼠变成了大老鼠,而原来的大老鼠又生出了一对小老鼠之后便死亡了,四周后,第一对出生的小老鼠(此时已经是大老鼠)又生出了一对小老鼠,此时共有三对老鼠。试编制程序,计算N周后有多少对老鼠?
基本要求:(1)编程实现,要求N的取值可以随意变换;
(2)实物演示时要求讲出程序原理;
提高要求:(1)能够采用一些形式动态描述老鼠出生和长大这一过程;
(2)考虑采用性能好的算法。
设计提示:老鼠的数量肯定是一个不断增长的过程,关键是找出该过程的规律,可以考虑采用递归的思想来实现该程序。

要用到待定系数法
a[n+1]-x1*a[n]=x2(a[n]-x1*a[n-1])
移项整理后对比系数得到:
x1+x2=1,x1x2=-1
解得:x1=(1+√5)/2,x2=(1-√5)/2
所以:a[n+1]-x1*a[n]=x2^(n-1)(a[2]-x1*a[1])
两边同时除以x1^(n+1)
a[n+1]/x1^(n+1)-a[n]/x1^n=(x2/x1)^(n-1)(a[2]-a[1])/x1^2
然后采用迭加法即可得到a[n]/x1^n
从而可以得到a[n]
将a[2]=a[1]=1带入化简整理即可得到:
a[n]=[((√5+1)/2)^n-((1-√5)/2)^n]/√5

经典C程序100例里面有这个

题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月
后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....
2.程序源代码:
#include "stdio.h"
#include "conio.h"
main()
{
long f1,f2;
int i;
f1=f2=1;
for(i=1;i<=20;i++)
{
printf("%12ld %12ld",f1,f2);
if(i%2==0) printf("\n"); /*控制输出,每行四个*/
f1=f1+f2; /*前两个月加起来赋值给第三个月*/
f2=f1+f2; /*前两个月加起来赋值给第三个月*/
}
getch();
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-06-06
#include <iostream>
using namespace std;
int mouse(int n)
{
int a[3]={1,0,0},i,temp1,temp2;
for (i=0;i<n;++i)
{
temp1=a[1];
temp2=a[2];
a[1]=a[0];
a[2]=temp1;
a[0]=temp1+temp2;
}
return (a[0]+a[1]+a[2]);
}

int main()
{
int n;
scanf("%d",&n);

printf("%d",mouse(n));

return 0;
}本回答被提问者采纳
相似回答