免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
251 [报告]
发表于 2010-11-09 00:49 |只看该作者
本帖最后由 剑子与剑痴 于 2010-11-09 13:01 编辑

这是我写的代码,路过的可以看下:

}
  1. #include <stdio.h>

  2. int born(int n); //子函数声明
  3. int a[3];        //定义数组,由于数组3个元素都是全局变量,在这里初始化为0
  4. void main()
  5. {   int i,n,sum=1;

  6.         printf("输入年份: ");
  7.         scanf("%d",&n);

  8.         for(i=1;i<=n;i++)
  9.                 sum+=born(i);

  10.         printf("母牛数 : %d\n",sum);
  11. }

  12. int born(int m)     //用于计算每年新增母牛数
  13. {
  14.         if(m<5)
  15.                 if(m<4) return 0;        //1-3年间无新增母牛
  16.                 else{ a[2]=1;return 1;} //第4年开始有新增母牛,数组元素a[2]=1,对应产1母牛
  17.         else
  18.                 return a[(m+1)%3]+=a[m%3]; //这是从第5年开始母牛数目增加的算法
复制代码

论坛徽章:
0
252 [报告]
发表于 2010-11-09 10:27 |只看该作者
昨晚的我打代码出了点错,重发:
  1. #include <stdio.h>
  2. int born(int n);
  3. int a[3];

  4. void main()
  5. {   int i,n,sum=1;

  6.         printf("输入年份: ");
  7.         scanf("%d",&n);

  8.         for(i=1;i<=n;i++)
  9.                 sum+=born(i);

  10.         printf("母牛数  : %d\n",sum);
  11. }

  12. int born(int m)
  13. {
  14.         if(m<5)
  15.                 if(m<4) return 0;
  16.                 else return a[2]=1;
  17.         else
  18.                 return a[(m+1)%3]+=a[m%3];
  19. }
复制代码

论坛徽章:
0
253 [报告]
发表于 2010-11-09 10:35 |只看该作者
回复 28# aero


你在28楼的解释太误人子弟了
    zlzj2010 在23楼的代码是完全正确的,好好看看清楚

这真是个拦坑啊

论坛徽章:
0
254 [报告]
发表于 2010-11-09 12:25 |只看该作者
我的非递归算法:
  1. #include <stdio.h>
  2. int born(int );
  3. int a[3];

  4. void main()
  5. {   
  6.         int i,n,sum=1;
  7.         printf("输入年份: ");
  8.         scanf("%d",&n);
  9.        
  10.         for(i=1;i<=n;i++)
  11.         {
  12.                 sum+=born(i);
  13.                 printf("第 %d 年 : %d\n",i,sum);
  14.         }
  15. }

  16. int born(int m)
  17. {
  18.         if(m<5)
  19.                 if(m<4) return 0;
  20.                 else return a[2]=1;
  21.         else
  22.                 return a[(m+1)%3]+=a[m%3];
  23. }
复制代码
我的递归算法:
  1. #include <stdio.h>
  2. int fun(int m);
  3. void main()
  4. {   
  5.         int i,n,sum=1;
  6.         printf("输入年份: ");
  7.         scanf("%d",&n);

  8.         for(i=1;i<=n;i++)
  9.         {       
  10.                 sum+=fun(i);
  11.                 printf("第 %d 年: %d\n",i,sum);
  12.         }
  13. }

  14. int fun(int m)
  15. {
  16.         if(m<5)
  17.                 if(m<4)  return 0;
  18.                 else return 1;
  19.         else  
  20.                 return fun(m-1)+fun(m-3);
  21. }
复制代码
后面这个算法比前面的慢

这两个算法在我的机子上调试编译通过,但因为采用的是int型变量,在50多年的时候就开始溢出了

论坛徽章:
0
255 [报告]
发表于 2010-11-09 12:45 |只看该作者
本帖最后由 剑子与剑痴 于 2010-11-09 12:59 编辑

再来一个不溢出的:

非递归算法:
  1. #include <stdio.h>

  2. typedef long double TYPE;
  3. TYPE born(int );
  4. TYPE a[3];

  5. void main()
  6. {   
  7.         int i,n;
  8.         TYPE sum=1;
  9.         printf("输入年份: ");
  10.         scanf("%d",&n);
  11.        
  12.         for(i=1;i<=n;i++)
  13.         {
  14.                 sum+=born(i);
  15.                 printf("第 %d 年 : %.0f\n",i,sum);
  16.         }
  17. }

  18. TYPE born(int m)
  19. {
  20.         if(m<5)
  21.                 if(m<4) return 0;
  22.                 else return a[2]=1;
  23.         else
  24.                 return a[(m+1)%3]+=a[m%3];
  25. }
复制代码
递归算法:
  1. #include <stdio.h>
  2. typedef long double  TYPE;

  3. TYPE fun(TYPE m);
  4. void main()
  5. {   
  6.         int i,n;
  7.         TYPE sum=1;
  8.         printf("输入年份: ");
  9.         scanf("%d",&n);

  10.         for(i=1;i<=n;i++)
  11.         {       
  12.                 sum+=fun(i);
  13.                 printf("第 %d 年: %.0f\n",i,sum);
  14.         }
  15. }

  16. TYPE fun(TYPE m)
  17. {
  18.         if(m<5)
  19.                 if(m<4)  return 0;
  20.                 else return 1;
  21.         else  
  22.                 return fun(m-1)+fun(m-3);
  23. }
复制代码
现在剩下的问题就是,下面的递归运算实在太慢了,有兴趣的可以改正下

论坛徽章:
0
256 [报告]
发表于 2010-11-10 23:02 |只看该作者
本帖最后由 DNFCF 于 2010-11-11 21:31 编辑
  1. #include<stdio.h>
  2. int main(void)
  3. {
  4. int year;
  5. int i=1;
  6. int sum=0;
  7. printf("please input years:");
  8. scanf("%d",&year);
  9. for(;i<=(year-year%3);i=i+3)
  10. sum=sum*2;
  11. printf("n=%d\n",sum);
  12. return 0;
  13. }
复制代码
这样写有错吗??

论坛徽章:
0
257 [报告]
发表于 2011-02-22 00:19 |只看该作者
how  long is the life of the cattle

论坛徽章:
1
白羊座
日期:2014-01-14 17:31:01
258 [报告]
发表于 2011-02-22 08:53 |只看该作者
呵呵,上面大意了做错了。这回应该对了,用递归做的。刚才仔细想了想,没想出来用非递归做的方法。有一点想 ...
aero 发表于 2003-08-03 22:31



    貌似还是有问题。

论坛徽章:
0
259 [报告]
发表于 2011-03-02 23:59 |只看该作者
不知道 是不是可以 采用 进程的 加 信号的 做法!转化一下   : 母牛看做 父进程, 父进程先定时 4秒, 以后每秒 fork 出 一个子进程,然后 子进程 也定时4秒,再fork 子进程!这样 N 秒后,让子进程全部退出, 采用收僵尸的方法,wait 所有的 子进程 ,记一个总数。这样 是不是应该 能达到效果呢??

论坛徽章:
0
260 [报告]
发表于 2011-03-08 15:58 |只看该作者
f(n) = f(n-1)+f(n-3) (n>=4)
f(1) = 1;
f(2) = 1;
f(3) = 1;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP