C语言编程题目 兔子繁衍问题?
如图,此题难度较大,要用到队列(我优化为循环队列)
运行结果,兔子数量变化符合斐波那契数列(下面一行数字为0~6岁每半岁兔子数量)
如图,如有疑问或不明白请追问哦!源代码如下:(网页端比较好看哦)
#include#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 0)i--;//下标循环往左移动else i=LIFETIME-1;}while(i!=babyI);printf("
");//换行//②半年后hY++;//时间过去半年age1I= (age1I+1)%LIFETIME ;//1岁数量(对)对应下标age5_5I= (age5_5I+1)%LIFETIME ;//5.5岁数量(对)对应下标//printf("%d,%d
",age1I,age5_5I);loveNum += num[age1I] -num[age5_5I];//可生育兔子数量(对)babyI = (babyI+1)%LIFETIME;//新babyI设为原最老兔子的下标,totalNum += loveNum - num[babyI];//每对大兔子可以生一对小兔子 - 死亡的老兔num[babyI] = loveNum ;//老兔的位置换成新兔}}
根据题意,得出以下结果:
年份:0 0.5 1 1.5 2 2.5 3 3.5 4 ...
兔子:1 1 2 3 5 8 13 21 34...
序号: 0 1 2 3 4 5 6 7 8...
所以发现规律:除前两个外,后面的则是等于前两个的种即:A0=1,A2=1,An=A(n-1)+A(n-2)
这样程序就可以开始编制了
#include "stdio.h"
main()
{
int year,total,i,a1,a2;
printf("
请输入多少年后:");
scanf("%d",&year);
a1=1;
a2=1;
for(i=2;i<2*year;i++)
{
if(i%2==1)
{
a1=a1+a2;
total=a1;
}else{
a2=a1+a2;
total=a2;
}
}
printf("
第%d年末总共会有%d对兔子",year,total);
}
方法一、用递归。
方法二、把兔子定义成结构,每个兔子自带计时器变量,繁殖就是新建节点,构建结构链表。每次循环遍历所有节点的计时变量大于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=1;i<=n;i++)
printf("经过%d个月后:兔子数量为:%d
",i,childbirth(0,i));
return 0;
}
#include <stdio.h>
typedef unsigned long long ULL;
int main() {
int month;
ULL m1=1,m2=1,f;
scanf("%d",&month);
for(int i=3; i<=month; i++) {
f=m2;
m2=m1+m2;
m1=f;
}
printf("兔子有%lld对",m2);
return 0;
}
斐波那契数列,了解一下。
代码网上太多了,就不给出了,自己搜索一下就好。
步子复方: 1 2 3 4 5 6 7 8 9 10 11 12 13#include <stdio.h> intmain() {intf1,f2,f,i;printf("1\t1\t");f1=f2=1;for(i=3;i<31;i++){f=f1+f2;printf("%d\t",f);f1=f2;f2=f;}return0; }
小金县17797118129: C语言 兔子繁殖问题和上楼梯 在线等 - ?
步子复方: #include<stdio.h> #include<stdlib.h> int fun(int n) {if(n==1||n==2)return 1;else{int c=1;for(int i=3;i<n+1;i++)c+=fun(i-2);return c;} } int main(void) {int i,x,x1,x2,n;x=0;x1=x2=1;scanf("%d",&n);/* if(n>=1&&n<=100){if(n==1||n==2)printf(...
小金县17797118129: c语言题老师留的 兔子繁殖问题,用递归函数的方法做. 个位大神编一个然后写下答案请写上兔子多少只 - ?
步子复方: //兔子的对数,就是Fibonacci数列 //1 1 2 3 5 8 13 21 34 55 89 ...1 2 3 4 5 6 7 8 9 10 11 12 13 14#include <stdio.h> intf(intn) {if(n < 3)return1;elsereturnf(n - 2) + f(n - 1); } voidmain() {intn;scanf("%d", &n);printf("%d年后,有兔子%d只.\n", n, f(n)); }
小金县17797118129: C语言迭代法兔子繁殖问题 - ?
步子复方: #include<stdio.h> int main(void) { long f1=1,f2=1;//定义数量 int i;//定义循环 int n;//定义月份 printf("请输入月数:"); scanf("%d",&n); if(i%2==1)//第奇数项,i%2必为1 { n=(n+1)/2;//每一轮计算两项,要n=1时计算1轮;n=3时计算2轮 ...
小金县17797118129: C语言(兔子生兔子的问题) - ?
步子复方: 啥白痴什么的就不必了- -人都是一点一点学会的嘛~ 1 有一对兔子,三个月生一对兔子,那么,1月:2个(1对);2月:2个(1对);3月:4个(2对); 兔宝宝不死,三个月生一对兔子,那么,4月:4个(这里应该是6个(即3对),因为第4...
小金县17797118129: C语言问题?
步子复方: int n;scanf("%d",&n);int i=0;while(i>0){ if((1+3*(0+(i-1))*i/2)>=n){ break; }}int result = i;for(j=1;j<3;j++){ if1+3*(0+(i-1))*i/2-i*j>=n){ result = result-1; }}printf("%d\n",&result);return 0;
小金县17797118129: 计算机课作业,关于兔子繁殖问题 - ?
步子复方: 第一个月小兔子没有繁殖能力,所以还是一对; 两个月后,生下一对小兔共有两对; 三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对; 依次类推可以列出下表: 所经过月数:0、1、2、3、4、5、6、7、8、9、1...
小金县17797118129: 兔子繁衍问题,裴波那契数列问题. - ?
步子复方: 最后一句话让我看到了希望! 输入s=0,k=2,n=0 然后让s=s+k 让k=k+n n=n+2 去到“while”循环,让s=N时退出
小金县17797118129: C语言的兔子问题?
步子复方: //斐波那契数列问题. //通过递归调用可以实现 //希望我的回答对你有帮助,呵呵 #include <stdio.h> int fun(int); int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { printf("%-4d",fun(i)); } printf("\n"); return 0; } int fun(int i) { if(i==1||i==2) return 1; else return fun(i-1)+fun(i-2); }
小金县17797118129: C语言兔子问题 - ?
步子复方: #include<stdio.h> int main(void) { int n,i,a,b,c; a=0; b=1; i=1; printf("请输入兔子对数n="); scanf("%d",&n); while(b<n){ c=a+b; /*while里面一次循环是1个月*/ a=b; b=c; i++; } printf("至少%d月",i); return 0; }