c语言兔子

c语言兔子,第1张

那个i用枣绝败来实现宏迅循环累加

这个其实就凳颤是Fibonacci数列的应用。

f(1)=f(2)=1 (i=1或者i=2)

f(i)=f(i-1)+f(i-2) (i>2)

附 几种求Fibonacci数列前20位的方法

#include<stdio.h>

int function(int n)

int main()

{

int i

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

printf("%d ",function(i))

printf("\n")

return 0

}

int function(int n)

{

if(n==1||n==2)return 1

else return function(n-1)+function(n-2)

}

********************************************************************************

#include<stdio.h>

int main()

{

int i,a[20]

for(i=0i<20i++)

{

if(i==0||i==1)a[i]=1

else a[i]=a[i-1]+a[i-2]

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

}

printf("\n")

return 0

}

********************************************************************************

#include <stdio.h>

int main()

{

int n

int fn

for(n=1n<21n++)

{

switch(n)

{

case 1:{fn=1break}

case 2:{fn=1break}

default:

{

int a=1,b=1,i,j

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

{

j=a+b

a=b

b=j

}

fn=j

}

}

printf("%d ",fn)

}

return 0

}

你图中的代码不对,题目明明说了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=Mi>0i--)

          x[i]+=x[i-1],x[i-1]=0//未超3个月的兔子成长一个月

      x[0]=x[M]*RN//新当月出生的兔子进入成长队列

      for(i=0,cnt=0i<=Mcnt+=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

}

有一对兔子,从出生后第 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

}

运行结果:

输入要计算的月数:10

10个月的兔子总数为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


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/yw/12527929.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存