社区
新手乐园
帖子详情
牛生牛的问题
quietsky
2006-04-25 01:29:06
求c/c++: 牛生牛的问题,一头母牛4年后每年生一头小母牛,生出来的母牛又4后每年又生小母牛,过n年后一共生都少头?请各位大哥给明思路。
...全文
591
23
打赏
收藏
牛生牛的问题
求c/c++: 牛生牛的问题,一头母牛4年后每年生一头小母牛,生出来的母牛又4后每年又生小母牛,过n年后一共生都少头?请各位大哥给明思路。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
牛
牛
量化策略交易
《
牛
牛
量化策略交易 - Python 课程》一套快速入门到精通的短视频教程 课程特点如下: 1. 从零开始教编程; 2. 量化与编程相结合; 3. 简易精炼,快速入门。 课程体系如下: 初级班 - 独立实现策略回测与分析...
牛
生
牛
问题
#一头母
牛
从出生后,每两年可以生下一头母
牛
,即在第二年和第四年分别可产下一头母
牛
,出生后 #第五年将会死去。假设农场现有一头母
牛
,N年后农场的母
牛
数目是多少。 #ruby def cow(year) v=[1,0,0,0,0] (1..year).each do |i| v[0],v[1],v[2],v[3],v[4]=v[1]+v[3],v[0]
算法递进笔记之农场
牛
生
牛
问题
算法及内存解析
问题
描述: 农场中有5岁的母
牛
,开始生小
牛
,每只
牛
4年后生且每年都只生一头小头,假定所生的的均为母
牛
,按照以上
牛
生
牛
原则,请问n年后农场有多少
牛
? 利用罗列的方式看是否有规律: 第1年:A A1 第2年:A A1 A2 第3年:A A1 A2 A3 第4年:A A1 A2 A3 A4 第5年:A A1 A2 A3 A4 A5 A11
递归算法10——复杂递归之大
牛
生
小
牛
问题
一只刚出生的小
牛
,4年后生一只小
牛
,以后每年生一只,现有一只刚出生的小
牛
,问20年后共有多少只。 【分析】
问题
可以分成两种情况处理:小于4年时,只有一只小
牛
;大于4年时,小
牛
长成大
牛
,开始生小
牛
。递归函数可以这样描述: 如果year<4,则返回1表示只有一头
牛
;当year≥4时,第4年的大
牛
开始生小
牛
,每年生一个。而且每隔3年,小
牛
长成大
牛
,开始生小
牛
。 code: ...
奶
牛
生
子
问题
(腾讯面试题)
问题
描述一只刚出生的奶
牛
,4年生1只奶
牛
,以后每一年生1只。现在给你一只刚出生的奶
牛
,求20年后有多少奶
牛
。
问题
分析本题是一个理想化的递归模型,在这20年中奶
牛
没有生老病死,并且全部都是具有正常生孕能力的母
牛
。大于等于四岁的奶
牛
会不间断的每年生一个小
牛
,小
牛
长到大于等于四岁也是如此,递归模型建立!代码如下#include
int sumcow(int years); int mai
新手乐园
33,311
社区成员
41,785
社区内容
发帖
与我相关
我的任务
新手乐园
C/C++ 新手乐园
复制链接
扫一扫
分享
社区描述
C/C++ 新手乐园
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章