兔子生兔子问题

来源:互联网 发布:王者荣耀战绩数据分析 编辑:程序博客网 时间:2024/03/28 19:35

//问题描述:兔子生兔子问题:有一对兔子,,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对
//兔子,假如兔子都不死,问每个月的兔子总数为多少?(假设我们要求打印出第一个月到第二十个月的兔子总数)
//可以得出规律:第一个月的兔子总数是1,第二个月的兔子总数是1,从第三个月开始,兔子总数是前两个月的兔子总数之和

//方法1:只用循环#include <iostream>using namespace std;int main(){int t1=1,t2=1;int t3;const int month=12; //第12月for(int i=3; i<=month; ++i){t3=t1+t2;  //第i月的兔子总数是前两个月的兔子总数之和      //更新第i+1个月的前两个月的兔子总数t1=t2; t2=t3;}cout<<"第"<<month<<"月的兔子总数是:"<<t3<<endl;return 0;}

 

//方法二:利用vector存储#include <iostream>#include <vector>using namespace std;int main(){vector<int>total;const int month=12; //第12月total.push_back(1); //第一月的兔子总数是1total.push_back(1); //第二月的兔子总数是1for(int i=3; i<=month; ++i){total.push_back(total[i-3]+total[i-2]); //第i月的兔子总数是第i-2月和第i-1月的兔子总数之和}cout<<"第"<<month<<"月的兔子总数是:"<<total[month-1]<<endl;return 0;}

 

//方法三:采用递归方法,利用函数递归#include <iostream>using namespace std;int GetTotalByMonth(int month) //根据第month月求出该月的兔子总数{if(month==1 || month==2)return 1;return GetTotalByMonth(month-2)+GetTotalByMonth(month-1);}int main(){const int month=12; //第12月cout<<"第"<<month<<"月的兔子总数是:"<<GetTotalByMonth(month)<<endl;return 0;}


 

//方法四:采用递归方法,利用模版元编程#include <iostream>using namespace std;template<int n>class GetTotalByMonth{public:enum{total=GetTotalByMonth<n-2>::total+GetTotalByMonth<n-1>::total}; //兔子总数是前两个月的兔子总数之和};template<>class GetTotalByMonth<1>  //第一月的兔子总数为1{public:enum{total=1};};template<>class GetTotalByMonth<2> //第二月的兔子总数为1{public:enum{total=1};};int main(){const int month=12; //第12月cout<<"第"<<month<<"月的兔子总数是:"<<GetTotalByMonth<12>::total<<endl;return 0;}

 

0 0