C语言编程:兔子繁殖问题

Python011

C语言编程:兔子繁殖问题,第1张

如图,此题难度较大,要用到队列(我优化为循环队列)(此题有两个提问,都是我回答所以一样)

运行结果,兔子数量变化符合斐波那契数列(下面一行数字为0~6岁每半岁兔子数量

源代码:(网页端才完整)

#include<stdio.h>

#define LIFETIME 13 //兔子寿命,单位半年(年龄小于此!)

#define INITNUM 1 //初始兔子有多少对

main()

{

int hY=0 //兔子历(就是时刻表):单位:半年

int num[LIFETIME]={INITNUM,0} //存储不同年龄兔子的对数(初始为0岁1对)

//babyI下标代表0岁,往前年龄增大,越过数组下界跳到上界,所以babyI+1反而是最老兔子

int babyI=0 //0岁兔子对应下标,年龄单位为半年

int loveNum=0 //可生育兔子数量

int totalNum=INITNUM //总计兔子数量

int age1I=LIFETIME-2 //1岁兔子对应下标(开始能生育)

int age5_5I=LIFETIME-11 //1岁、5.5岁兔子对应下标(刚好能生育、刚好不能生育年龄)

int n=30 //输入n半年后!

while(hY <= n){

int i,j //遍历临时变量。①展示兔子数量。

printf("第%.1f年\t总计:%d对\t可生育:%d对\n",(float)hY/2,totalNum,loveNum)

/*

for(i=0 i<LIFETIME i++){

printf("%.1f岁\t",(float)i/2 ) //打印表头

//printf("%d,%.1f岁\t",i,(float)(++i)/2 ) //打印表头

}printf("单位:对\n") //换行*/

i=babyI //显示各年龄对应数量

j=0

do{

//printf("%d\t",num[i])

if(hY<21){ //仅用于加\t显示

if((++j)%2==0)printf("\t")}

printf("%d ",num[i])

if(i>0)i-- //下标循环往左移动

else i=LIFETIME-1

}while(i!=babyI)

printf("\n") //换行

//②半年后

hY++ //时间过去半年

age1I= (age1I+1)%LIFETIME  //1岁数量(对)对应下标

age5_5I= (age5_5I+1)%LIFETIME //5.5岁数量(对)对应下标

//printf("%d,%d\n",age1I,age5_5I)

loveNum += num[age1I] -num[age5_5I] //可生育兔子数量(对)

babyI = (babyI+1)%LIFETIME //新babyI设为原最老兔子的下标,

totalNum += loveNum - num[babyI] //每对大兔子可以生一对小兔子 - 死亡的老兔

num[babyI] = loveNum  //老兔的位置换成新兔

}

}

方法一、用递归。

方法二、把兔子定义成结构,每个兔子自带计时器变量,繁殖就是新建节点,构建结构链表。每次循环遍历所有节点的计时变量大于3的就新建一个节点插入链表。最后统计节点数量。

我用方法1来写:

#include <stdio.h>

int childbirth(int bMth,int gMth)//bMth:调用时传0,gMth:经过的最大月数

{

  int cnt=0,n=bMth,num=2

  while(n++<gMth+1)

      if(cnt++>2)

          num=num+childbirth(n,gMth+1)

  return num

}

int main()

{

  int i,n

  printf("请输入经过多少月:"),scanf("%d",&n)

  for(i=1i<=ni++)

      printf("经过%d个月后:兔子数量为:%d\n",i,childbirth(0,i))

  return 0

}

啥白痴什么的就不必了- -人都是一点一点学会的嘛~

1

有一对兔子,三个月生一对兔子,那么,1月:2个(1对);2月:2个(1对);3月:4个(2对);

兔宝宝不死,三个月生一对兔子,那么,4月:4个(这里应该是6个(即3对),因为第4月时最开始的一对兔子还会继续生。。);5月:4个(这里应该是10个(即5对),因为最开始的一对兔子与第3月出生的一对兔子,他们在第5月生了2对,在加上原来的,即5对。。)

以后同理。。。。。。。。。。。。。。。。(呃。。其实你就理解成斐波那契数列就行了。。)

2

if(i%2==0) printf("\n")/*控制输出,每行四个*/

它其实就是一个显示格式的问题。。i代表当前的月份数,一次PRINTF()输出当前月份的兔子数。所以就是输出4个数就换行。。。