首页 > 试题广场 > 统计每个月兔子的总数
[编程题]统计每个月兔子的总数

有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少?

 

    /**
     * 统计出兔子总数。
     * 
     * @param monthCount 第几个月
     * @return 兔子总数
     */
    public static int getTotalCount(int monthCount)
    {
        return 0;
    }

 

 


输入描述:

输入int型表示month



输出描述:

输出兔子总数int型

示例1

输入

9

输出

34
#include <iostream>
using namespace std;

int main(){
    int m;
    while(cin>>m){
        int a=1,b=0,c=0;//a:一个月兔子数,b:两个月兔子数,c:三个月兔子个数
        while(--m){//每过一个月兔子数变化
            c+=b;
            b=a;
            a=c;
        }
        cout<<a+b+c<<endl;
    }
}

发表于 2016-09-07 16:16:20 回复(20)
#include <stdio.h>

int main()
{
    ///关键是找到递推式 f(n)=f(n-1)+f(n-2) (n>=4)
    ///递推式的解释:对于第n个月的兔子数量:有两部分组成,
    ///一部分是上个月的兔子f(n-1),另一部是满足3个月大的兔子
    ///会生一只兔子f(n-2)
    int arr[100];
    int i,N;
    arr[1]=arr[2]=1;
    arr[3]=2;
    for(i=4;i<100;i++){
        arr[i]=arr[i-1]+arr[i-2];
    }
    while((scanf("%d",&N))!=EOF){
        printf("%d\n",arr[N]);
    }
    return 0;
}



编辑于 2016-01-28 21:32:39 回复(11)
23ms 277k
import java.util.Scanner;
public class Main{
	
    public static void main(String[] args){
    	Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
        	int input = sc.nextInt();
        	System.out.println(Main.getNumber(input));
        	        	
        }
    }
    //通过列举出每月的有生育能力兔子的数目,没有生能力的兔子的说目,一月大的兔子的数目和二月大的兔子的数目可知
    //
    public static int getNumber(int mounth){
    	if(mounth == 1 || mounth == 2){
    		return 1;
    	}
    	int tempold = 1;
    	int tempyoung = 1;
    	int mounth1 = 1;
    	int mounth2 = 0;
    	for(int j = 4; j <= mounth; j++){
    		//第一步,第二个月的变成了有生育能力的兔子
    		tempold += mounth2;
    		//第二步,一个月大的兔子变成了两个月大的兔子
    		mounth2 = mounth1;
    		//第三步,有生育能力的兔子生出了一个月大的小兔子
    		mounth1 = tempold;
    		//当月小兔子的个数
    		tempyoung = mounth1 + mounth2;  		
    		
    	}
    	return tempold + tempyoung;
    }
}

发表于 2016-05-26 11:24:08 回复(4)
import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
            int monthCount = in.nextInt();
            System.out.println(getTotalCount(monthCount));
        }
        in.close();
    }
    
    public static int getTotalCount(int monthCount){
        if(monthCount==1 || monthCount==2){
            return 1;
        }
        
        return getTotalCount(monthCount-1)+getTotalCount(monthCount-2);
    }
}

发表于 2016-04-04 10:24:25 回复(2)
#include<iostream>
using namespace std;
int getTotalCount(int month)
{
	int count;
	if (month < 3)
		count = 1;
	else
		count = getTotalCount(month - 1) + getTotalCount(month - 2);
	return count;
}
int main()
{
	int month;
	while (cin >> month)
	{
		cout << getTotalCount(month)<<endl;
	}
	return 0;
}


发表于 2017-06-17 15:45:59 回复(1)

python解法如下

while True:
    try:
        a=int(input())-1
        arr=[1,2]
        while len(arr)<a:
            arr.append(arr[-1]+arr[-2])
        print(arr[-1])
    except:
        break
编辑于 2017-09-18 10:45:43 回复(2)
本质上是斐波那契数列,没什么好讲的,就是用递归来算
#include<bits/stdc++.h>
using namespace std;
int num_rabit(int month){
    int res;
    if(month==1 || month==2 )
            res=1;
    else
        res=num_rabit(month-1)+num_rabit(month-2);
    return res;
}
int main(){
    int month;
    while(cin>>month){
        
       int res=num_rabit(month);
        cout<<res<<endl;
    }
    return 0;
}

发表于 2017-12-10 22:03:11 回复(0)
/*注意:题目意思是兔子第三个月就可以生小兔子,也就是经过两个月之后*/
#include<iostream>
using namespace std;
int countRabbit(int n)
{
    if(n==1 || n==2)
        return 1;
    return countRabbit(n-1)+countRabbit(n-2);
}
int main()
{
    int n;
    while(cin>>n)
    {
        int num=countRabbit(n);
        cout<<num<<endl;
 }
    return 0;
}

发表于 2016-12-18 19:33:38 回复(0)
import java.util.*;

public class Main {
	
	public static int get(int month){
		if(month <= 0)
			return 0;
		if(month == 1 || month == 2)
			return 1;
		else
			return get(month - 1) + get(month - 2);
	}
	
    public static void main(String[] args) {
    	Scanner sc = new Scanner(System.in);
    	while(sc.hasNext()){
    		int month = sc.nextInt();
    		System.out.println(get(month));    		
    	}
    	sc.close();
    }     
}

发表于 2016-08-10 18:54:07 回复(0)
#斐波那契数列
def num(n):
    if n == 1:
        return 1
    elif n == 2:
        return 1
    else:
        return num(n-1)+num(n-2)
while True:
    try:
        month = int(input())
        number = num(month)
        print(number)
    except:
        break
发表于 2019-10-03 04:13:02 回复(0)
#include <iostream>
#include <algorithm>

using namespace std;

/**
 * 统计出兔子总数。
 * 
 * @param monthCount 第几个月
 * @return 兔子总数
 */
    
static int getTotalCount(int monthCount)
{
    int sum=1;
    vector<int> tumon;
    
    tumon.push_back(0);        //有一只兔兔刚出生
        
    for(int i=0; i<monthCount; i++) {
        int zl=0;    //兔子当月增量为所有满两个月兔兔的数量
        for(auto tutu:tumon) {
            if(tutu+2 <= i)     //第三个月,即满两个月可生一只兔兔
                zl++;
        }
        sum += zl;
        while(zl--)
            tumon.push_back(i);
        //cout<<sum<<" ";
    }
    
    return sum;
}

int main()
{
    int mon;
    
    while(cin>>mon) {
        cout<<getTotalCount(mon)<<endl;
    }
}

发表于 2019-08-09 15:46:58 回复(0)
while True:
    try:
        s=int(input())
        if s==1 or s==2:
            print(1)
        else:
            ls=[1,1]
            x=s-2
            while x>0:
                ls.append(ls[-1]+ls[-2])
                x-=1
            print(ls[-1])
    except:
        break

发表于 2019-07-15 22:18:30 回复(0)
机试题就是这道,当时调用递归函数一直报错,回来测试发现必须用while,系统会测试多项用例输入
var sum=0
function rab(n){
    if(n==1 || n ==2){
        return 1
    }else{
        return rab(n-1)+rab(n-2)
    }     
}
while(n=readline()){
    console.log(rab(n))
}

发表于 2019-04-25 19:02:57 回复(0)
其实是斐波那契数列
#include <iostream>
using namespace std;
int fun(int num)
{
    if(num==1||num==2)
        return 1;
    return fun(num-1)+fun(num-2);
}
int main()
{
    int n;
    while(cin>>n)
        cout<<fun(n)<<endl;
    return 0;
}

发表于 2019-04-08 09:19:41 回复(0)
#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int counts[3], num;
    while (cin >> num)
    {
        counts[0] = 1; //第一个月的时候有一只一个月大的兔子
        counts[1] = counts[2] = 0; //0只两个月大和三个月大的兔子
        for (int i = 2; i <= num; ++i) //从第二个月到最后一个月循环
        {
            counts[2] += counts[1]; //新的一个月原来两个月大的兔子现在三个月大了,所以加到三个月及三个月以上的兔子的总数里。
            counts[1] = counts[0]; //原来一个月大的兔子现在变成两个月大的了
            counts[0] = counts[2]; //现在三个月大的兔子每只都生一只一个月大的兔子
        }
        cout << counts[0] + counts[1] + counts[2] << endl;
    }
    return 0;
}

编辑于 2018-11-25 21:49:54 回复(0)
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()) {
            int n = sc.nextInt();
            int month1 = 1;//1个月兔子
            int month2 = 0;//2个月兔子
            int month3 = 0;//3个月兔子
            while(--n>0) {
                month3 += month2;
                month2 = month1;
                month1 = month3;
            }
            System.out.println(month1+month2+month3);
        }
    }
}

发表于 2018-10-04 18:42:24 回复(0)
#include <iostream>
#include <cstdio>
#include <cstdlib>

using namespace std;

int main()
{     int n,a[101]={0,1};     for(int i=2;i<=100;i++)         a[i] = a[i-1]+a[i-2];     while(cin>>n)         cout<<a[n]<<endl;     return 0;
}

发表于 2018-07-04 01:08:23 回复(0)
#include <iostream>
using namespace std;
int main(){
    int m;
    while(cin>>m)
    {
        int birth[100]={0,1,0,1};
        for(int i=4;i<=m;i++)
           birth[i]=birth[i-1]+birth[i-2];
        int sum=0;
        for(int i=1;i<=m;i++)
            sum+=birth[i];
        cout<<sum<<endl;
    }
    return 0;
}

发表于 2018-06-20 17:06:12 回复(0)
//用循环代替递归,循环中的操作尽量直观
import java.util.*;
public class Main
{
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        while(in.hasNext())
        {
            int m1=1,m2=1,temp;
            int month = in.nextInt();
            if(month==1||month==2)
                System.out.println(1);    //输出第一个月和第二个月的兔子数
            else 
            {
                for(int i=3;i<=month;i++)
                {
                    temp = m2;
                    m2 = m1 + m2;
                    m1 = temp;
                }
                System.out.println(m2);    //从第三个月开始的兔子数目
            }
        }
    }
}
发表于 2018-03-09 09:40:34 回复(0)
#include<iostream>
#include<string>
using namespace std;



int fun(int n)
{
    if (n == 0) return 0;
    else if (n == 1) return 1;
    else return fun(n - 1) + fun(n - 2);
}

int main()
{
    int n;
    while (cin>>n)
    {
        int sum = fun(n);
        cout << sum << endl;
    }
    system("pause");
    return 0;
}


F数列走你
发表于 2017-09-17 11:49:23 回复(0)