[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
  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 编辑 ]
1

评分人数

    • youxi01: PB + 16 技术 + 16 + 4 精华 + 6

TOP

呵呵,管理员过奖了。

[ 本帖最后由 sonic_andy 于 2008-2-9 10:50 编辑 ]

TOP

返回列表