编程求解母牛问题,若一头母牛,从出生起第四年开始每年生一头母牛,按此规律,第n年时有多少头母牛?
一个变量作为天数,一个变量作为牛的头数,一开始一头牛,4年生一头母牛的话,就是第4年是2,之后每次到4的倍数,现有牛就会翻倍,因为过了4年
所以得出
int niu = 1;
for(int i = 4 ; i != 天数; ++i){//多少天的循环
if(i%4==0)niu+=niu;
}//循环结束后,niu就是所有的牛
int niu(int n) {
int niu = 1;
for (int i = 0; i != n; ++i) {// 多少天的循环
if (i % 4 == 0)
niu += niu;
}// 循环结束后,niu就是所有的牛
return niu;
}
第一年有多少头母牛?
类似于斐波那契数列问题http://blog.sina.com.cn/s/blog_a2a6827e01013sbn.html看一下这个
从出生起第四年开始每年生一头母牛,也就是牛在第一年出生后,第四年,第五年……每年都会生小牛。
参考斐波那契兔子问题,可以知道 通项公式为 T(n)=T(n-1)+T(n-3)
公式可以这么理解, 第n年的牛数量等于去年牛的数量加上今天新生小牛的数量,去年牛的数量是 T(n-1) xi
因为第四年后的牛都会生小牛,所以第n年的小牛数目就是 T(n-3)年的牛数。那时候的牛到了第n年都会生小牛,n-1,n-2年新出生的小牛在第n年还不会生小牛。
public int number(int n){
if(n<=0)
return 0;
if(n<4)
return 1;
return number(n-1)+number(n-3);
}
典型的斐波那契数列,让你掌握迭代和递归的知识,你可以扩展学一下动态规划和汉诺塔问题,解决的思想差不多
程序输入年数n即可,vector中存储的是所有牛的年龄,从大到小,看函数输出结果一目了然就懂了
#include <vector>
#include <iostream>
using namespace std;
void OneYearPass(vector<int>& v)
{
int n = v.size();
for(int i=0;i<n;i++)
{
if(v[i]>=4)
{
v.push_back(1);
}
v[i]+=1;
}
for(int i=0;i<v.size();i++)
{
cout<<v[i]<<" ";
}
cout<<endl;
}
int main()
{
vector<int> v;
v.push_back(1);
int n;
cin>>n;
cout<<"第1年:"<<endl<<1<<endl;
for(int i=0;i<n;i++)
{
cout<<"第"<<i+2<<"年:"<<endl;
OneYearPass(v);
}
return 0;
}