有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
兔子的规律为数列:
1, 1, 2, 3, 5, 8, 13, 21 ....下面使用了迭代、递归和数组三种解法。
【代码一】使用迭代:
#include <stdio.h>int main()
{
long f1=1, f2=1 // 兔子的数量 局并
int i // 循环次数
int n // 要计算的月份
printf("输入要计算的月数:")
scanf("%d", &n)
// 计算出循环次数
if(n%2==1){
n = (n+1)/2
}else{
n = n/2
}
for(i=1i<=ni++){
printf("第%d个月有%d只\n", i*2-1, f1)
printf("第%d个月有%d只\n", i*2, f2)
f1=f1+f2 /*前两个月加起来赋值给第三个月*/
f2=f1+f2 /*前两个月加起来赋值给第三个月*/
}
return 0
}
运行结果:
输入要计算的月数:10第1个月有1只
第2个月有1只
第3个月有2只
第4个月有3只
第5个月有5只
第6个月有8只
第7个月有13只
第8个月有21只
第9个月有34只
第10个月有55只
【方法二】使用递归:
#include<stdio.h>int Feibonacci(int n){
if(n==1||n==2)
return 1
else
return Feibonacci(n-1)+Feibonacci(n-2)
}
int main(){
int n // 要计算的月份
桐郑迹 printf("输入要计算的月数:")
scanf("%d", &n)
printf("%d个月的兔子总数为%d\n", n, Feibonacci(n))
return 0
}
运行结果:
输入要计算的月数:1010个月的兔子总数为55
递归看上去非常符合逻辑,但是这种递归效率是非常慢的,不信你计算20, 30, 40 个月的兔子数试试,明显比另外两种方法慢多了,具体分析请看:C语言用递归求斐波那契数,让你发现递归的缺陷和效率瓶颈
【代码三】使用数组
#include<stdio.h>void main()
{
int a[100] ,i,n
printf("请输入月数:")
scanf("%d",&n)
a[0]=a[1]=1
for(i=2i<ni++)
a[i]=a[i-1]+a[i-2]
printf("第%d个月的兔子为:%d\n", n, a[n-1])
}
运行结果:
请输入月丛猛数:10第10个月的兔子为:55
#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
}
啥白痴什么的就不必了- -人都是一点一点学会的嘛~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个数就换行。。。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)