CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

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

楼主dskra(绿青虫)2003-11-02 22:13:59 在 C/C++ / C语言 提问

一头小母牛到第四年才开始每年生一头小母牛,这样n年有几头母牛。    
  谁帮我算算,最好有注解。 问题点数:60、回复次数:8Top

1 楼ALNG(?)回复于 2003-11-02 23:23:14 得分 20

年份     有生育能力牛数     新生牛数     总数  
  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;  
  }  
   
  Top

2 楼zhaochong12(超级大笨鸟)回复于 2003-11-02 23:26:29 得分 20

#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++;   //可爱的小牛多一头  
  }  
  大概就是这样了~时间有点紧~楼主没有解决的话留言~Top

3 楼zhaochong12(超级大笨鸟)回复于 2003-11-02 23:29:30 得分 0

-_-#...甘拜下风!!!!  
  ALNG(?)的算法何止好我千倍!  
  ....得了~  
  接分快乐!^_^~  
   
  谢谢!ALNG   ,   学到了!  
   
  Top

4 楼ALNG(?)回复于 2003-11-02 23:37:35 得分 0

这有一个玩具,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;  
  }  
  //---------------------------------------------------------------------------  
  Top

5 楼ALNG(?)回复于 2003-11-03 05:56:12 得分 20

看错题了。是每年生一头小母牛而不是每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);  
  }  
  Top

6 楼dskra(绿青虫)回复于 2003-11-03 12:13:22 得分 0

好了,这么多。等我看完就结贴。Top

7 楼bambooshan(j)回复于 2003-11-03 15:56:48 得分 0

不是吧,我看最好的办法应该是用“递归”法!Top

8 楼ding198116(阿拉丁)回复于 2003-11-03 16:06:20 得分 0

迭代比较好,能让人理解!!Top

相关问题

  • <<c++ primer>> 23页练习2.4怎么做?
  • 一道c练习题,很简单,但我不会做!
  • 软设下午题该怎么去练习?
  • 我的一本c++教程,刚刚下载了练习答案,不会用,
  • 严蔚敏练习册上的一道题,不会编,求大哥们帮助
  • DataReport怎么不会刷新?
  • 好难,不会,怎么写。
  • 各位有看 龙书 的吗? 第一个练习题我就不会!!给我讲讲吧,谢谢!
  • 钱能的C++程序设计教程的课后练习中的问题
  • 钱能的一道引用练习题,有点不明白,请各位指教。

关键词

  • vector
  • cow
  • unsigned
  • age
  • 牛数
  • std
  • grow
  • community
  • 生一头小母牛
  • count

得分解答快速导航

  • 帖主:dskra
  • ALNG
  • zhaochong12
  • ALNG

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo