Board logo

标题: 如何利用批处理解决这个数学问题(4个数字间填入符号后等于某个数字) [打印本页]

作者: novaa    时间: 2007-11-16 22:12     标题: 如何利用批处理解决这个数学问题(4个数字间填入符号后等于某个数字)

比如说有这四个数字
7 5 6 9 3
要在每个数间填入符号+ - * /
使上式等于6
作者: youxi01    时间: 2007-11-16 23:15

这个题目 有点点难度(似乎我原来发过类似的),组合的可能性好多啊
作者: youxi01    时间: 2007-11-16 23:26

还是人工来好了,哈哈。
(7- 5)×[6 -(9/3)]=6
作者: novaa    时间: 2007-11-16 23:31

呵呵
闲着不想做事情
就想P可以做些什么
想起以前C#里面的题目
很多都已经嘿你们用P做了
想到这个好像没有就发上来了
作者: 随风    时间: 2007-11-17 00:27

这个太难了,牵扯到除法问题,括弧问题.
组合太多了.
作者: 辉少    时间: 2007-12-18 02:55

可以做得出来吗?
有难度
作者: ranon    时间: 2007-12-22 12:42

:time: :time: :time: :time: :time: :time:
作者: sonic_andy    时间: 2008-2-6 11:05

  1. :: 思路如下
  2. :: 实际上加减乘除是一个树形遍历的问题
  3. :: 可以使用递归的方式来解决
  4. :: 暂时没有考虑到算符的优先级,按照从左到右的顺序执行计算
  5. @echo off
  6. setlocal
  7. call :func 1 6 7 7 5 6 9 3
  8. pause
  9. exit /b
  10. ::*******************************************************************************
  11. :: 递归函数,第一个参数为深度
  12. :: 第二个参数为最后的结果
  13. :: 第三个参数为当前运算的结果
  14. :: 第四个参数为第一个数,以此类推第五,六,七,八个参数。
  15. :: 第九个参数为已经使用的符号索引1=+ 2=- 3=* 4=/ 123=A+B-C*D
  16. :func
  17. setlocal enabledelayedexpansion
  18. :: 深度
  19. set /a depth=%1
  20. :: 结果
  21. set /a result=%2
  22. :: 当前运算结果
  23. set /a current=%3
  24. :: 已经使用的符号索引
  25. set sign=%9
  26. for /l %%i in (1,1,4) do (
  27.         setlocal enabledelayedexpansion
  28.         set /a index=!depth!+4
  29.         call :getarg !index! %*
  30.         set /a no=!errorlevel!
  31.         call :calc !current! %%i !no!
  32.         set /a new=!errorlevel!
  33.         if !depth! LSS 4 (
  34.                 set /a newdepth=!depth!+1
  35.                 call :func !newdepth! !result! !new! %4 %5 %6 %7 %8 !sign!%%i
  36.         ) else (
  37.                 if !new!==!result! (
  38.                         call :showresult %2 %4 %5 %6 %7 %8 !sign!%%i
  39.                 )
  40.         )
  41. )
  42. exit /b 0
  43. ::*******************************************************************************
  44. ::*******************************************************************************
  45. :: 功能:进行计算
  46. :: %1=当前数 %2=运算方式(1=+ 2=- 3=* 4=/) %3=下一个数
  47. :: 返回值:运算结果
  48. :calc
  49. setlocal enabledelayedexpansion
  50. set /a num=%1
  51. if %2==1 (
  52.         set /a num+=%3
  53. )
  54. if %2==2 (
  55.         set /a num-=%3
  56. )
  57. if %2==3 (
  58.         set /a num*=%3
  59. )
  60. if %2==4 (
  61.         set /a z=!num!%%%3
  62.         if !z!==0 (
  63.                 set /a num/=%3
  64.         ) else (
  65.                 set /a num=-10000
  66.         )
  67. )
  68. exit /b !num!
  69. ::*******************************************************************************
  70. ::*******************************************************************************
  71. :: 动态获得参数
  72. :: %1=要得到第几个参数
  73. :: %2=%*
  74. :getarg
  75. setlocal enabledelayedexpansion
  76. set /a num=%1-1
  77. for /l %%i in (1,1,!num!) do shift /2
  78. exit /b %2
  79. ::*******************************************************************************
  80. ::*******************************************************************************
  81. :: 根据参数填写符号和数字
  82. :: %1=Result %2=N1 %3=N2 %4=N3 %5=N4 %6=N5 %7=符号[1-4][1-4][1-4]
  83. :showresult
  84. setlocal enabledelayedexpansion
  85. set msg=%2
  86. for /l %%i in (1,1,4) do (
  87.         set /a t=1
  88.         set /a k=4-%%i
  89.         for /l %%j in (1,1,!k!) do (
  90.                 set /a t=!t!*10
  91.         )
  92.         set /a t=%7/t
  93.         set /a t=t%%10
  94.         if !t!==1 (
  95.                 set msg=!msg! +
  96.         )
  97.         if !t!==2 (
  98.                 set msg=!msg! -
  99.         )
  100.         if !t!==3 (
  101.                 set msg=!msg! *
  102.         )
  103.         if !t!==4 (
  104.                 set msg=!msg! /
  105.         )
  106.         set /a t=%%i+2
  107.         call :getarg !t! %*
  108.         set msg=!msg! !errorlevel!
  109. )
  110. echo !msg! = %1
  111. exit /b
  112. ::*******************************************************************************
复制代码

[ 本帖最后由 sonic_andy 于 2008-2-9 10:48 编辑 ]
作者: youxi01    时间: 2008-2-8 14:37

楼上兄弟的功底不错嘛
作者: sonic_andy    时间: 2008-2-9 10:45

呵呵,管理员过奖了。

[ 本帖最后由 sonic_andy 于 2008-2-9 10:50 编辑 ]
作者: more    时间: 2008-4-19 15:32

这样的局限性太小了,如果能写出个算24点的就好了.
作者: terse    时间: 2008-4-29 21:49

我是写了一个24点的  但P不能处理小数  没有更好的解决办法  暂时不用除法 所以有局限性 看看高手怎么解决吧
上来改个代码
  1. @echo off&setlocal enabledelayedexpansion
  2. set/p var=输入4个数(空格隔开)
  3. for %%i in (!var!) do set/a n+=1&set !n!=%%i
  4. set m1=+&set m2=-&set m3=*
  5. for /l %%i in (1 1 %n%) do (
  6.   for /l %%j in (1 1 %n%) do (
  7.     for /l %%k in (1 1 %n%) do (
  8.       for /l %%l in (1 1 %n%) do (
  9.           if not "%%i"=="%%j" (
  10.           if not "%%i"=="%%k" (
  11.           if not "%%i"=="%%l" (
  12.           if not "%%j"=="%%k" (
  13.           if not "%%j"=="%%l" (
  14.           if not "%%l"=="%%k" (
  15.       if not defined %%i%%j%%k%%l set %%i%%j%%k%%l=ok&(
  16.       for /l %%a in (1,1,3) do (
  17.         for /l %%b in (1,1,3) do (
  18.           for /l %%c in (1,1,3) do (
  19.       set/a str=!%%i!!m%%a!!%%j!!m%%b!!%%k!!m%%c!!%%l!
  20.       if "!str!" == "24" echo !%%i!!m%%a!!%%j!!m%%b!!%%k!!m%%c!!%%l!=!str!&exit
  21.       set/a str=^(!%%i!!m%%a!!%%j!^)!m%%b!!%%k!!m%%c!!%%l!
  22.       if "!str!" == "24" set/p=^(!%%i!!m%%a!!%%j!^)!m%%b!!%%k!!m%%c!!%%l!=!str!&exit
  23.       set/a str=!%%i!!m%%a!^(!%%j!!m%%b!!%%k!^)!m%%c!!%%l!
  24.       if "!str!" == "24" set/p=!%%i!!m%%a!^(!%%j!!m%%b!!%%k!^)!m%%c!!%%l!=!str!&exit
  25.       set/a str=!%%i!!m%%a!!%%j!!m%%b!^(!%%k!!m%%c!!%%l!^)
  26.       if "!str!" == "24" set/p=!%%i!!m%%a!!%%j!!m%%b!^(!%%k!!m%%c!!%%l!^)=!str!&exit
  27.       set/a str=^(!%%i!!m%%a!!%%j!!m%%b!!%%k!^)!m%%c!!%%l!
  28.       if "!str!" == "24" set/p=^(!%%i!!m%%a!!%%j!!m%%b!!%%k!^)!m%%c!!%%l!=!str!&exit
  29.       set/a str=!%%i!!m%%a!^(!%%j!!m%%b!!%%k!!m%%c!!%%l!^)
  30.       if "!str!" == "24" set/p=!%%i!!m%%a!^(!%%j!!m%%b!!%%k!!m%%c!!%%l!^)=!str!&exit
  31.       set/a str=^(!%%i!!m%%a!!%%j!^)!m%%b!^(!%%k!!m%%c!!%%l!^)
  32.       if "!str!" == "24" set/p=^(!%%i!!m%%a!!%%j!^)!m%%b!^(!%%k!!m%%c!!%%l!^)=!str!&exit
  33.       set/a str=^(!%%i!!m%%a!^(!%%j!!m%%b!!%%k!^)^)!m%%c!!%%l!
  34.       if "!str!" == "24" set/p=^(!%%i!!m%%a!^(!%%j!!m%%b!!%%k!^)^)!m%%c!!%%l!=!str!&exit
  35.       set/a str=^(^(!%%i!!m%%a!!%%j!^)!m%%b!!%%k!^)!m%%c!!%%l!
  36.       if "!str!" == "24" set/p=^(^(!%%i!!m%%a!!%%j!^)!m%%b!!%%k!^)!m%%c!!%%l!=!str!&exit
  37.       set/a str=!%%i!!m%%a!^(!%%j!!m%%b!^(!%%k!!m%%c!!%%l!^)^)
  38.       if "!str!" == "24" set/p=!%%i!!m%%a!^(!%%j!!m%%b!^(!%%k!!m%%c!!%%l!^)^)=!str!&exit
  39.       set/a str=!%%i!!m%%a!^(^(!%%j!!m%%b!!%%k!^)!m%%c!!%%l!^)
  40.       if "!str!" == "24" set/p=!%%i!!m%%a!^(^(!%%j!!m%%b!!%%k!^)!m%%c!!%%l!^)=!str!&exit
  41. ))))))))))))))
  42. echo.
  43. echo 对不起,没算出来!
  44. echo.
  45. pause
复制代码

[ 本帖最后由 terse 于 2008-8-4 12:43 编辑 ]
作者: xiong8707    时间: 2008-12-25 22:47     标题: 有BUG哦

输入 同样的数字 会发生不计算的错误




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2