数学研发论坛

 找回密码
 欢迎注册
楼主: mathematica

[擂台] 求算24点的程序,要求快且求出所有解!

[复制链接]
发表于 2012-4-18 17:52:04 | 显示全部楼层
10# mathe

mathe 貌似对 Mathematica来兴趣了,赫赫
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2012-4-18 19:12:03 | 显示全部楼层
没有,今天发了很多贴,只是为了将主页上一些讨厌的广告信息去掉
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2012-4-18 23:27:25 | 显示全部楼层

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2012-4-21 14:12:11 | 显示全部楼层
我也看不懂,Mathematica的函数真多
mathe 发表于 2012-4-18 13:20

所以才方便、强大。不过也养成了我的依赖性,凡事皆找找有没有现成合适的函数,实在打不到才自己想算法、手工写函数。可我自己用的并不熟练,所以经常在“Help”里到处翻箱倒柜。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2012-4-21 20:47:34 | 显示全部楼层
14# hujunhua

Mathematica程序就该这样写
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2012-4-22 21:17:33 | 显示全部楼层
javascript的eval可以用
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-6-25 12:11:51 | 显示全部楼层

  1. calc24[list_] :=   Block[{fmt, ok},
  2.    fmt = {"((``````)````)````", "(``````)``(``````)",
  3.      "(````(``````))````", "````((``````)````)", "````(````(``````))"};
  4.    ok[fmt_, ls_, op_] := If[ToExpression@ToString@# == 24, Print[#, "=", 24]
  5.          ] &@StringForm[fmt, ##] & @@ Riffle[ls, op];
  6.    Quiet@Do[  ok[#, list, op] & /@ fmt, {op, {"+", "-", "×", "÷"}~Tuples~3}]];

  7. calc24@{1, 2, 3, 4}
  8. calc24~Scan~Permutations@{3, 3, 8, 8}
复制代码
((1+2)+3)*4=24

(1+(2+3))*4=24

((1*2)*3)*4=24

(1*2)*(3*4)=24

(1*(2*3))*4=24

1*((2*3)*4)=24

1*(2*(3*4))=24

8/(3-(8/3))=24

点评

能说下你的代码啥意思吗?  发表于 2018-7-27 13:01
看不懂你的代码,我已经把所有的结果都穷举出来了,你写代码看看  发表于 2018-7-25 16:53
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-6-29 20:20:15 | 显示全部楼层
要是不限定各种操作符的使用次数,然后问题推广到n个数,就更有趣味了。

点评

2^n
超过人的脑力所能,就没有趣味了。  发表于 2013-7-3 18:01
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-7-3 18:24:49 | 显示全部楼层
@2^n
要是按题目的要求,数字和操作符都只使用一次,用软件或者编程语言,就有点大炮打蚊子,同样趣味不够
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2018-7-25 15:01:14 | 显示全部楼层
本帖最后由 mathematica 于 2018-7-25 17:04 编辑
  1. #include<stdio.h>
  2. char mark[4]={'+','-','*','/'};
  3. float cal(float x,float y,int mark)
  4. {
  5.   switch(mark)
  6.   {
  7.     case 0:return x+y;
  8.     case 1:return x-y;
  9.     case 2:return x*y;
  10.     case 3:return x/y;
  11.   }
  12. }
  13. float calculate_A(float a,float b,float c,float d,int mark1,int mark2,int mark3)
  14. {
  15.   float r1,r2,r3;
  16.   r1=cal(a,b,mark1);
  17.   r2=cal(r1,c,mark2);
  18.   r3=cal(r2,d,mark3);
  19.   return r3;
  20. }
  21. float calculate_B(float a,float b,float c,float d,int mark1,int mark2,int mark3)
  22. {
  23.   float r1,r2,r3;
  24.   r1=cal(b,c,mark2);
  25.   r2=cal(a,r1,mark1);
  26.   r3=cal(r2,d,mark3);
  27.   return r3;
  28. }
  29. float calculate_C(float a,float b,float c,float d,int mark1,int mark2,int mark3)
  30. {
  31.   float r1,r2,r3;
  32.   r1=cal(c,d,mark3);
  33.   r2=cal(b,r1,mark2);
  34.   r3=cal(a,r2,mark1);
  35.   return r3;
  36. }
  37. float calculate_D(float a,float b,float c,float d,int mark1,int mark2,int mark3)
  38. {
  39.   float r1,r2,r3;
  40.   r1=cal(b,c,mark2);
  41.   r2=cal(r1,d,mark3);
  42.   r3=cal(a,r2,mark1);
  43.   return r3;
  44. }
  45. float calculate_E(float a,float b,float c,float d,int mark1,int mark2,int mark3)
  46. {
  47.   float r1,r2,r3;
  48.   r1=cal(a,b,mark1);
  49.   r2=cal(c,d,mark3);
  50.   r3=cal(r1,r2,mark2);
  51.   return r3;
  52. }
  53. float get(int a,int b,int c,int d)
  54. {
  55.   int mark1,mark2,mark3;
  56.   float flag=0;
  57.   for(mark1=0;mark1<4;mark1++)
  58.   {
  59.     for(mark2=0;mark2<4;mark2++)
  60.     {
  61.       for(mark3=0;mark3<4;mark3++)
  62.       {
  63.         if(calculate_A(a,b,c,d,mark1,mark2,mark3)==24)
  64.         {
  65.           printf("((%d%c%d)%c%d)%c%d=24\n",a,mark[mark1],b,mark[mark2],c,mark[mark3],d);
  66.           flag=1;
  67.         }
  68.         if(calculate_B(a,b,c,d,mark1,mark2,mark3)==24)
  69.         {
  70.           printf("(%d%c(%d%c%d))%c%d=24\n",a,mark[mark1],b,mark[mark2],c,mark[mark3],d);
  71.           flag=1;
  72.         }
  73.         if(calculate_C(a,b,c,d,mark1,mark2,mark3)==24)
  74.         {
  75.           printf("%d%c(%d%c(%d%c%d))=24\n",a,mark[mark1],b,mark[mark2],c,mark[mark3],d);
  76.           flag=1;
  77.         }
  78.         if(calculate_D(a,b,c,d,mark1,mark2,mark3)==24)
  79.         {
  80.           printf("%d%c((%d%c%d)%c%d)=24\n",a,mark[mark1],b,mark[mark2],c,mark[mark3],d);
  81.           flag=1;
  82.         }
  83.         if(calculate_E(a,b,c,d,mark1,mark2,mark3)==24)
  84.         {
  85.           printf("(%d%c%d)%c(%d%c%d)=24\n",a,mark[mark1],b,mark[mark2],c,mark[mark3],d);
  86.           flag=1;
  87.         }
  88.       }
  89.     }
  90.   }
  91.   return flag;
  92. }
  93. main()
  94. {
  95.   int a,b,c,d;
  96.   printf("Please input 4 numbers(1~13):");
  97.   scanf("%d%d%d%d",&a,&b,&c,&d);
  98.     if((a>=1&&a<=13)&&(b>=1&&b<=13)&&(c>=1&&c<=13)&&(d>=1&&d<=13))
  99.     {
  100.       get(a,b,c,d);
  101.     }
  102.       else
  103.       {
  104.         printf("Input illegal,please input again(1~13):");
  105.         scanf("%d%d%d%d",&a,&b,&c,&d);
  106.         if((a>=1&&a<=13)&&(b>=1&&b<=13)&&(c>=1&&c<=13)&&(d>=1&&d<=13))
  107.          {
  108.               get(a,b,c,d);
  109.          }
  110.       }
  111.   system("pause");
  112. }
复制代码

代码写得非常棒,我一下子看明白了
https://blog.csdn.net/xyisv/article/details/54709207
  1. get(a,b,c,d);
  2. get(a,b,d,c);
  3. get(a,c,b,d);
  4. get(a,c,d,b);
  5. get(a,d,b,c);
  6. get(a,d,c,b);
  7. get(b,a,c,d);
  8. get(b,a,d,c);
  9. get(b,c,a,d);
  10. get(b,c,d,a);
  11. get(b,d,a,c);
  12. get(b,d,c,a);
  13. get(c,a,b,d);
  14. get(c,a,d,b);
  15. get(c,b,a,d);
  16. get(c,b,d,a);
  17. get(c,d,a,b);
  18. get(c,d,b,a);
  19. get(d,a,b,c);
  20. get(d,a,c,b);
  21. get(d,b,a,c);
  22. get(d,b,c,a);
  23. get(d,c,a,b);
  24. get(d,c,b,a);
复制代码

代码改成这24行,才完美


点评

虽然没有注释,但是这么棒的代码,我还是一下子看明白了  发表于 2018-7-25 15:03
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2019-1-16 11:20 , Processed in 0.058541 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表