钱能的练习4-10怎么也不会做。

luckyum 2003-11-02 10:13:59
一头小母牛到第四年才开始每年生一头小母牛,这样n年有几头母牛。
谁帮我算算,最好有注解。
...全文
51 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
luckyum 2003-11-03
  • 打赏
  • 举报
回复
好了,这么多。等我看完就结贴。
孩皮妞野 2003-11-03
  • 打赏
  • 举报
回复
看错题了。是每年生一头小母牛而不是每4年生一头小母牛。

上面的玩具程序改一句就可以了
void cow::grow()
{
if(++age>=4) // 改这句
community.push_back(cow());
}

但是说它是玩具,就是说这样是没有效率的。下面是一个O(n)的算法

#include <iostream>

// 注意,没有处理数据过大时溢出的问题
unsigned find(unsigned n)
{
// count[0-3] 是0-3岁的牛数
// count[4] 是4岁及以上的牛数
unsigned count[5]={1,0};

for(unsigned i=0; i<n; ++i){
// 一年后发生什么事?
// 1. 小牛长一岁,表现在代码上就是
// count[5]+=count[4]
// count[4]=count[3]
// count[3]=count[2]
// count[2] = count[1];
// count[1] = count[0];
// 2. 性成熟的母牛产仔, 数目等于当前的count[5]
count[4] += count[3]; // 3岁母牛加入生育大军
for(unsigned j=3,k=2; j>0; --j,--k)
count[j] = count[k]; // 各长1岁
count[0] = count[4]; // 新生儿

}

// 汇总输出
unsigned sum=0;
for(unsigned i=0; i<5; ++i)
sum += count[i];
return sum;
}


main()
{
unsigned n=1;
do{
std::cout<<"enter years[n], 0 to exit:"<<std::endl;
std::cin>>n;
std::cout<<n<<" years later, there will be "<<find(n)<<" cows"<<std::endl;
}while(n);
}
ding198116 2003-11-03
  • 打赏
  • 举报
回复
迭代比较好,能让人理解!!
bambooshan 2003-11-03
  • 打赏
  • 举报
回复
不是吧,我看最好的办法应该是用“递归”法!
孩皮妞野 2003-11-02
  • 打赏
  • 举报
回复
这有一个玩具,n别太大。


#include<vector>
#include <iostream>

struct cow
{
unsigned age;
public:
cow():age(0){}
cow(const cow& c):age(c.age){}

void grow(); // 长一岁

public:
static std::vector<cow>& community;
};

std::vector<cow> c;
std::vector<cow>& cow::community=c;

void cow::grow()
{
if(++age%4==0)
community.push_back(cow());
}

void find(unsigned n)
{
c.push_back(cow());
for(unsigned i=0; i<n; ++i){
unsigned s = c.size();
for(unsigned j=0; j<s; ++j)
c[j].grow();
}
std::cout<<n<<" years later, you will have "<<c.size()<<" cows."<<std::endl;

}

//---------------------------------------------------------------------------


int main(int argc, char* argv[])
{
unsigned n;
std::cout<<"Enter years(n):"<<std::endl;
std::cin>>n;
find(n);
return 0;
}
//---------------------------------------------------------------------------
zhaochong12 2003-11-02
  • 打赏
  • 举报
回复
-_-#...甘拜下风!!!!
ALNG(?)的算法何止好我千倍!
....得了~
接分快乐!^_^~

谢谢!ALNG , 学到了!

zhaochong12 2003-11-02
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;
main()
{
int cattle=0,num=n/4; //变幻一下,1变一牛
for(int iFor=0;iFor<num;iFor++) //第一只牛生小牛,四年一个~
for(int tFor=iFor+2;tFor<num;tFor++) //小牛生小牛,4年一个~
for(int threeFor=tFor+tFor;threeFor<num;threeFor++)
//以后每次的乖乖小牛
cattle++; //可爱的小牛多一头
}
大概就是这样了~时间有点紧~楼主没有解决的话留言~
孩皮妞野 2003-11-02
  • 打赏
  • 举报
回复
年份 有生育能力牛数 新生牛数 总数
0 0 1 1
4 1 1 2
8 2 2 4
12 4 4 8
...


所以
Niu(N) = 2^(n/4)



#include <iostream>

main()
{
unsigned n;
std::cout<<"enter n:"<<std::endl;
std::cin>>n;

n/=4;
if(n<32)
std::cout<<(1<<n)<<std::endl;
else
std::cout<<"fuck, too many years. ask god!"<<std::endl;
}

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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