免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: loveguohuasai
打印 上一主题 下一主题

[算法] 母牛数量算法 [复制链接]

论坛徽章:
0
241 [报告]
发表于 2008-08-01 11:55 |只看该作者
这么老的帖子都被挖出来了啊

论坛徽章:
0
242 [报告]
发表于 2008-08-01 18:34 |只看该作者
刚学C语言是做过这道题 好像用循环最好

论坛徽章:
0
243 [报告]
发表于 2008-08-01 19:31 |只看该作者
用矩阵的幂算类fib数是很基本的算法常识好不好

论坛徽章:
0
244 [报告]
发表于 2008-08-09 11:30 |只看该作者
矩阵求幂+尾递归+gmp果然可以几乎立刻计算出第100年,甚至第1000003年母牛的数量。

http://blog.chinaunix.net/u2/75244/showart.php?id=1106205

论坛徽章:
0
245 [报告]
发表于 2008-08-09 11:31 |只看该作者
递归:   
  #define   MAX_YEAR   40   
   
  int   nSum=0;//总头数,全局量或静态量   
  void   牛的一生(int   nYear)//表示牛是在第几个年头生的   
  {   
   
  nSum++;//又多了一头牛   
  nYear++;if   (nYear>=MAX_YEAR)return;//大了一岁   
  nYear++;if   (nYear>=MAX_YEAR)return;//大了一岁   
  nYear++;if   (nYear>=MAX_YEAR)return;//大了一岁   
  nYear++;if   (nYear>=MAX_YEAR)return;//大了一岁   
  //前面四句可以合为一句,主要是为了大家看清楚   
  for(;nYear   <   MAX_YEAR;nYear++)   call   牛的一生(nYear);   
  }   
  输出nSum;

论坛徽章:
0
246 [报告]
发表于 2010-11-05 13:10 |只看该作者
假设单性繁殖成立,若一头母牛,从出生起第四个年头开始,每年生一头母牛,而生出的小母牛在之后的第四年也将具有生殖能力,按此规律,第n年时有多少头牛?

递归写法:
#include<iostream>
using namespace std;
int ox(int year)  
{
     if(year<4)
    return 1;
    return ox(year-1)+ox(year-3);   
}   
int main()
{    int year;
     cout<<"输入年份:"<<endl;
     cin>>year;      
     cout<<"一共的母牛数:"<<ox(year)<<endl;
      
    system("pause";
    return 0;        
}

非递归写法:
#include<iostream>
using namespace std;
int main()
{
    cout<<"输入年份year:"<<endl;
    for(int year;cin>>year
      {
          int a3=1;
          for(int i=4,a1=1,a2=1,temp;i<=year;i++)
             {
                temp=a1;
                a1=a2;
                a2=a3;
                a3+=temp;         
             }
     cout<<"第year年:"<<a3<<"\n";
      }
    system("pause";        
}

论坛徽章:
0
247 [报告]
发表于 2010-11-05 13:46 |只看该作者
本帖最后由 ypyf3000 于 2010-11-05 13:49 编辑

  1. cow :: (Num a) => a -> a
  2. cow n = case n of
  3.     1 -> 1
  4.     2 -> 1
  5.     3 -> 1
  6.     _ -> (cow (n-1)) + (cow (n-3))
复制代码

论坛徽章:
0
248 [报告]
发表于 2010-11-05 23:00 |只看该作者
不用递归啊,想想规律用循环最好了。下面的代码调试过了。
aero 发表于 2003-08-03 20:57


这个不对,测试一下,3年应该只有一头牛,你这个算法就是3头了

论坛徽章:
0
249 [报告]
发表于 2010-11-06 14:08 |只看该作者
  1. #include <stdio.h>

  2. /*
  3. cow0 = 0岁的牛
  4. cow1 = 1岁的牛
  5. cow2 = 2岁的牛
  6. cow3 = 3岁的牛, 可以生牛仔的
  7. */

  8. int main() {
  9.         int cow0, cow1, cow2, cow3;
  10.         int i, n, tmp, total;
  11.        
  12.         cow0 = 1;
  13.         cow1 = cow2 = cow3 = 0;
  14.        
  15.         scanf("%d", &n);
  16.         for (i = 1; i <= n; i++) {
  17.                 tmp = cow3;//保持可以生牛仔的母牛
  18.                
  19.                 cow3 += cow2;//可以生牛仔的母牛增加(由2岁的母牛变成)
  20.                 cow2 = cow1;//2岁的母牛等于1岁的母牛
  21.                 cow1 = cow0;//1岁的母牛等于0岁的母牛
  22.                 cow0 = tmp;//0岁的母牛等于可以生牛仔的母牛数(由可以生牛仔的母牛生产)
  23.         }
  24.        
  25.         total = cow0 + cow1 +cow2 + cow3;
  26.         printf("%d\n", total);
  27.        
  28.         return 0;
  29. }
复制代码

论坛徽章:
0
250 [报告]
发表于 2010-11-08 20:40 |只看该作者
回复 1# loveguohuasai

  最近学了haskell 就凑热闹写一个haskell的版本吧。:)
  year1 [y1,y2,y3,y4x] = y1
  year2 [y1,y2,y3,y4x] = y2
  year3 [y1,y2,y3,y4x] = y3
  year4x [y1,y2,y3,y4x] = y4x
  cow_group_sum year = sum (group year)
  group 1 = [1,0,0,0]
  group year = [(year4x (group (year-1))), (year1 (group (year-1))), (year2 (group (year-1))), ((year4x (group (year-1))) + (year3 (group (year -1))))]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP