牛生牛的问题

quietsky 2006-04-25 01:29:06
求c/c++: 牛生牛的问题,一头母牛4年后每年生一头小母牛,生出来的母牛又4后每年又生小母牛,过n年后一共生都少头?请各位大哥给明思路。
...全文
591 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
End_less 2006-04-27
  • 打赏
  • 举报
回复
看了楼上很多前辈们的想法..昨天下午上课的时候也想了个办法来解决..先放到这里来给大家求证一下..自我感觉这样的方法更加贴切问题的本质^_^.具体的方法如下:

其实我们可以把任何一头母牛所处在的状态划分为以下四个方面:1,处在第一年的母牛牛.2,处在第二年的母牛,3,处在第三年的母牛,4,处于生产期的母牛..简单的把以上四种状态简写为:W1,W2,W3,P..很显然..所有在整个过程中出现的母牛都属于这四种状态之一,而且这四种状态互斥..
那么很简单的,可以这样推算,当由第n年向第n+1年过渡的时候,这四种状态所包含的牛的数目之间的相互影响(状态的转变)关系如下("A->B"代表A对B造成影响):W1->W2,W2->W3,W3->P,W3->W1,P->W1..这里特别说明一下W3和P的状态转变,其实对于处于第三年的母牛,当它们到第四年的时候,会转变成W1和P两种状态(母牛本身转变位P状态,它生的小牛转变为W1状态,两者数目都等于当前的W3所包含的数目);而对于处于生产期的母牛,会产生新的小牛并使新的小牛转变为W1状态..
那么我们从第一年开始,根据以上相互影响的关系统计每年在各种状态下的母牛的数目,可以写出以下的表来:
年数 W1 W2 W3 P SUM
1 1 0 0 0 1
2 0 1 0 0 1
3 0 0 1 0 1
4 1 0 0 1 2
5 1 1 0 1 3
6 1 1 1 1 4
7 2 1 1 2 6
8 3 2 1 3 9
9 4 3 2 4 13
10 6 4 2 6 18
11 8 6 4 8 26
....
具体总结一下..就是每一年的W2数目(以下简称W2)等于上一年的W1,每一年的W3等于上一年的W2,每一年的P等于上一年的W3+P,每一年的W1同样也等于上一年的W3+P,这与当年的P相同..所以可以简单的只考虑W2,W3,和P,代码如下:


void main()
{
int CurrentData[4]={0,0,0};
int LastData[3]={1,0,0};
//这里是从第三年开始计的,而且数组中只是依次保存W2,W3,P的三项数据.
scanf("%d\n",%n);
for(int i=3;i<=n;i++){
CurrentData[0]=LastData[2];
CurrentData[1]=LastData[0];
CurrentData[2]=LastData[1]+LastData[2];
}
printf("There're %d cows!\n",CurrentData[0]+CurrentData[1]+CurrentData[2]*2);
}

ok,这样子应该就可以了..XP下没有VC..没有经过调试的..
大家看一看这样能不能通过..


lovetsfuer 2006-04-26
  • 打赏
  • 举报
回复
我也学习。
ZhuXiaohang 2006-04-26
  • 打赏
  • 举报
回复

看到前面有用递归调用的,且不论编的对错,

一般,用递归调用解决问题思路简单
但,函数递归调用本身就十分耗cpu时间和内存,如果年数一大,执行起来必然很满
ZhuXiaohang 2006-04-26
  • 打赏
  • 举报
回复
问题没那么复杂,

解决方法:
对于第n年(n>4)的牛可以分成两类,一类是今年刚出生的另一类是以前出生的.
对于以前出生的,数目等于去年的总数;
对于今年刚出生的等于从第一年到n-4年各年牛数的总和.
所以 当 n>4 时, f(n) = f(n-1) + { f(1)+f(2)+......+f(n-5)+f(n-4) }
当 n<=4时, f(n) = 1


为了清晰,显示如下:
年数 n: 1 2 3 4 5 6 7 8 9 ......
牛数 f(n): 1 1 1 1 2 4 7 11 17 ......

程序如下:(程序太小,用面向过程~)
#include <iostream>
using namespace std;

int main()
{int yn=0,fn=0,sum=0; // yn为年数,fn为牛总数,sum为第1年到第yn-4年的牛总数

cout<<"Please input the number of the year : ";
cin>>yn;

where (yn<=0) //输入年数,年数必须大于0
{cout<<"Error! Please input integer!"<<endl;
cout<<"Please input the number of the year : ";
cin>>yn;
}

if(yn<=4) // 前4年牛数均为1
{cout<<"the number of the cow is : 1"<<endl;
exit();
}

for(int i=1,a=1,b=1,c=1;i<=(yn-4);i++) // 当年数>=5时,计算sum和第yn年的总牛数
{sum += a; //sum为第1年到第yn-4年的牛总数,a为第yn-3年的牛数
fn = sum + c; //b为第yn-2年的牛数,c为第yn-1年的牛数
a=b; //___从第1年开始计算,初始时,sum=1,a为第2年牛数为1
b=c; //___b为第3年牛数为1,c为第4年牛数为1,fn为第5年牛树,
c=fn; //___fn=sum+c=1+1=2
} //___就这样,循环计算一直到第yn年

cout<<"the number of the cow is : "<<fn<<endl;
}
suicuicui 2006-04-26
  • 打赏
  • 举报
回复


递归
我测试过没有问题

F(1)=1
F(2)=1
F(3)=1
F(4)=2
F(n)=f(n-1)+f(n-4)
拔萝卜的Tank 2006-04-26
  • 打赏
  • 举报
回复
太简单了哦.在谭永鳞的C/C++的书上就有和你差不多的问题,不过那是兔子每3 个月就生一个,采用递归就可以了
iamdavid0123 2006-04-25
  • 打赏
  • 举报
回复
int NumOfCow(int year)
{
if( year==0 )
return 0;
else
{
if( year==1 || year==2 || year==3 )
return 1;
else if( year==4 )
return 2;
else
return NumOfCow(year-1)+NumOfCow(year-4);
}
}
=========================
没有验证过,随便写写的
寻开心 2006-04-25
  • 打赏
  • 举报
回复
以前讨论过这个
http://topic.csdn.net/t/20050216/13/3785317.html
有递归的方法,也有非递归的方法
iamcaicainiao 2006-04-25
  • 打赏
  • 举报
回复
抛开女儿国的问题,觉得顾问团挺有道理的。以前也看过,没深究。
jixingzhong 2006-04-25
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>


void main()
{
int n, sum=1, s=1;

puts("pleas input how many years later:");
scanf("%d", &n);
n /= 4;
if(n<2)
{
printf("There is %d cow!", sum);
return;
}
else
{
while(n>0)
{
sum += s;
s = sum - s;
n--;
}
}

printf("There is %d cows!", sum);
getch();
}
gernal_dn 2006-04-25
  • 打赏
  • 举报
回复
这道题有个很大很大的问题:
公牛在哪里?!
回交?乱伦?!
或者是克隆牛?

寻开心 2006-04-25
  • 打赏
  • 举报
回复
这个牛不错,肯定是喝女儿国的水长大的,只生牡牛
是这样写的: 1岁的牛用f1函数表示,2岁的牛用f2函数表示,3岁的牛用f3表示,4岁的用f4表示

f1(n) = f4(n-1); f1(1) = 1;
f2(n) = f1(n-1); f2(1) = 0;
f3(n) = f2(n-1); f3(1) = 0;
f4(n) = f4(n)+f3(n); f4(1) = 0;
总牛数 = f1(n) + f2(n) + f3(n) + f4(n);
duduhaha 2006-04-25
  • 打赏
  • 举报
回复
哦,还有一个问题
//================================
//牛会死吗
//================================

这问题牛逼,呵呵.
mysear 2006-04-25
  • 打赏
  • 举报
回复
n 年:1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12……
f(n) 牛:1, 1, 1, 2, 3, 4, 5, 7, 10, 14, 19, 26……

第5年之前,分别为 1, 1, 1, 2,
从第5年开始f(n) = f(n-1) + f(n-4); n从5开始
klkkklkl 2006-04-25
  • 打赏
  • 举报
回复
int fun1(int n)
{
int s=1;
if(n>4)
{
for(int i=1;i<=n-4;i++)
{
s+=fun1(i);
}
}

return s;
}

int main(int argc, char* argv[])
{
int pp=fun1(20);
return 0;
}

接分
iamcaicainiao 2006-04-25
  • 打赏
  • 举报
回复
8对,8对,还是8队。
iamcaicainiao 2006-04-25
  • 打赏
  • 举报
回复
n 年:1, 2, 3, 4, 5, 6, 7, 8, 9, 10,……
f(n) 牛:1, 1, 1, 2, 3, 4, 6, 9, 13, 18,……

第6年之前,分别为 1, 1, 1, 2, 3,
从第6年开始f(n) = f(n-1) + n-5; n从6开始
iamcaicainiao 2006-04-25
  • 打赏
  • 举报
回复
8对,8对,那个公式8对阿。
popohei 2006-04-25
  • 打赏
  • 举报
回复
哦,还有一个问题
//================================
//牛会死吗
//================================
popohei 2006-04-25
  • 打赏
  • 举报
回复
递归吧:
//以下代码没有测试,这是一个思路

//返回直系儿子的个数,参数的牛的年龄
int getSon(int age)
{
if(age>4) return age-4;
else return 0;
}

//获取这个家族中的牛数,age是最最老的祖先的年龄
int getFamily(int age)
{
int family = 1;
int son = getSon(age);

//获得第i-4个儿子家的人数
for(int i=4; i<son; i++)
family += getFamily(age-4);
return family;
}
加载更多回复(3)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧