忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 2561 | 回复: 2

这个算24点的程序的bug是? [复制链接]

论坛徽章:
0
发表于 2018-07-27 15:01 |显示全部楼层
  1. #算24点程序
  2. #use strict;use warnings;use diagnostics;
  3. use strict;
  4. my $a=9;
  5. my $b=9;
  6. my $c=4;
  7. my $d=3;
  8. #利用穷举法,列出abcd四个变量之间所有的各种排列
  9. &cacu($a,$b,$c,$d);
  10. &cacu($a,$b,$d,$c);
  11. &cacu($a,$c,$b,$d);
  12. &cacu($a,$c,$d,$b);
  13. &cacu($a,$d,$b,$c);
  14. &cacu($a,$d,$c,$b);
  15. &cacu($b,$a,$c,$d);
  16. &cacu($b,$a,$d,$c);
  17. &cacu($b,$c,$a,$d);
  18. &cacu($b,$c,$d,$a);
  19. &cacu($b,$d,$a,$c);
  20. &cacu($b,$d,$c,$a);
  21. &cacu($c,$a,$b,$d);
  22. &cacu($c,$a,$d,$b);
  23. &cacu($c,$b,$a,$d);
  24. &cacu($c,$b,$d,$a);
  25. &cacu($c,$d,$a,$b);
  26. &cacu($c,$d,$b,$a);
  27. &cacu($d,$a,$b,$c);
  28. &cacu($d,$a,$c,$b);
  29. &cacu($d,$b,$a,$c);
  30. &cacu($d,$b,$c,$a);
  31. &cacu($d,$c,$a,$b);
  32. &cacu($d,$c,$b,$a);
  33. #子函数,利用三重循环计算abcd位置不变的时候的所有可能,
  34. #四个数之间只可能有三种运算符,加括号只可能有五种可能.
  35. sub cacu
  36. {
  37.     my ($a,$b,$c,$d)=@_;
  38.     my @op=("+","-","*","/");#运算符数组
  39.     my $x;my $y;my $z;
  40.     my $str1;my $str2;my $str3;my $str4;my $str5;
  41.     foreach $x (@op)#第一个运算符
  42.     {
  43.         foreach $y (@op)#第二个运算符
  44.         {
  45.             foreach $z (@op)#第三个运算符
  46.             {
  47.                 $str1="(($a$x$b)$y$c)$z$d";
  48.                 $str2="($a$x$b)$y($c$z$d)";
  49.                 $str3="($a$x($b$y$c))$z$d";
  50.                 $str4="$a$x(($b$y$c)$z$d)";
  51.                 $str5="$a$x($b$y($c$z$d))";
  52.                 if(abs(eval($str1)-24)<0.000001){print $str1 . "=24\n";}
  53.                 if(abs(eval($str2)-24)<0.000001){print $str2 . "=24\n";}
  54.                 if(abs(eval($str3)-24)<0.000001){print $str3 . "=24\n";}
  55.                 if(abs(eval($str4)-24)<0.000001){print $str4 . "=24\n";}
  56.                 if(abs(eval($str5)-24)<0.000001){print $str5 . "=24\n";}
  57.             }
  58.         }
  59.     }
  60. }
复制代码
把第三行
use strict;

换成
use strict;use warnings;use diagnostics;

那么结果将少很多,请问这啥原因导致的,我觉得程序没bug呀

论坛徽章:
0
发表于 2018-08-03 14:43 |显示全部楼层
送你上去

论坛徽章:
11
子鼠
日期:2014-10-11 16:46:4815-16赛季CBA联赛之山东
日期:2017-11-10 14:32:142016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:532016科比退役纪念章
日期:2018-03-16 10:24:05
发表于 2018-08-31 09:47 |显示全部楼层
本帖最后由 523066680 于 2018-08-31 09:53 编辑

这种写法是不严谨的,0.000001这样的精度有可能在某些极端情况下导致误判,最好是所有数字作为分数处理(有理数化)

以及在计算公式中可能出现除以0而导致的错误。

验证方法就是,把数字组合 9 9 4 3 ,换成 8 9 4 3 后没有出现错误提示。


您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP