C语言问题,这个代码功能是怎么实现的,帮我解释下这个代码?
你图中的代码不对,题目明明说了3个月后开始生,你这代码x明显是总对数,月份从1开始,带入这个代码,先不管别的,第一次循环结束(也就是第二个月)x就是2对了。兔子刚出生1个月就生。
我写得话,用一个数组做成长队列,数组最后一个元素才是可以生育的兔子对数。下面是演示代码(我理解题目说的“3月后开始生”,就是第4个月生,如你认为第3个月就开始生,自行修改常量即可):
代码输出兔子成长繁殖过程,常量包括初始兔子数量,繁殖增量,繁殖周期,可自行修改。
思路:代码中变量数组x,每个元素分别对应:新生兔子数,1个月大的兔子数,2个月大的兔子数,3个月大的兔子数。每经过一个月数组前一个元素值会累加到后一个元素值表示成长,同时最后一个元素值就是生育的兔子,生育出的新生兔会放在第一个元素中,如此循环。变量cnt是累计总数。所有数值单位是对。
#include <stdio.h>
#define N 1
#define M 3//出生几个月后开始生
#define RN 1//每对兔子每月生出对数
int main()
{
int n,i,cnt=N,x[M+1]={0},month=1;
x[0]=cnt;
do
printf("请输入期望多少对兔子:"),scanf("%d",&n);
while(n>10000);
printf("第1个月,有新生兔子%d对\n",x[0]);
while(1)
{
month++;
for(i=M;i>0;i--)
x[i]+=x[i-1],x[i-1]=0;//未超3个月的兔子成长一个月
x[0]=x[M]*RN;//新当月出生的兔子进入成长队列
for(i=0,cnt=0;i<=M;cnt+=x[i],i++);//统计兔子总数(单位:对)
printf("第%d个月,新生%d对,1个月大的%d对,2个月的%d对,3个月的%d对,共计%d对兔子\n",month,x[0],x[1],x[2],x
[3],cnt);
if(cnt>=n) break;
}
return 0;
}