-
- :: 思路如下
- :: 实际上加减乘除是一个树形遍历的问题
- :: 可以使用递归的方式来解决
- :: 暂时没有考虑到算符的优先级,按照从左到右的顺序执行计算
- @echo off
- setlocal
- call :func 1 6 7 7 5 6 9 3
- pause
- exit /b
- ::*******************************************************************************
- :: 递归函数,第一个参数为深度
- :: 第二个参数为最后的结果
- :: 第三个参数为当前运算的结果
- :: 第四个参数为第一个数,以此类推第五,六,七,八个参数。
- :: 第九个参数为已经使用的符号索引1=+ 2=- 3=* 4=/ 123=A+B-C*D
- :func
- setlocal enabledelayedexpansion
- :: 深度
- set /a depth=%1
- :: 结果
- set /a result=%2
- :: 当前运算结果
- set /a current=%3
- :: 已经使用的符号索引
- set sign=%9
- for /l %%i in (1,1,4) do (
- setlocal enabledelayedexpansion
- set /a index=!depth!+4
- call :getarg !index! %*
- set /a no=!errorlevel!
- call :calc !current! %%i !no!
- set /a new=!errorlevel!
- if !depth! LSS 4 (
- set /a newdepth=!depth!+1
- call :func !newdepth! !result! !new! %4 %5 %6 %7 %8 !sign!%%i
- ) else (
- if !new!==!result! (
- call :showresult %2 %4 %5 %6 %7 %8 !sign!%%i
- )
- )
- )
- exit /b 0
- ::*******************************************************************************
- ::*******************************************************************************
- :: 功能:进行计算
- :: %1=当前数 %2=运算方式(1=+ 2=- 3=* 4=/) %3=下一个数
- :: 返回值:运算结果
- :calc
- setlocal enabledelayedexpansion
- set /a num=%1
- if %2==1 (
- set /a num+=%3
- )
- if %2==2 (
- set /a num-=%3
- )
- if %2==3 (
- set /a num*=%3
- )
- if %2==4 (
- set /a z=!num!%%%3
- if !z!==0 (
- set /a num/=%3
- ) else (
- set /a num=-10000
- )
- )
- exit /b !num!
- ::*******************************************************************************
- ::*******************************************************************************
- :: 动态获得参数
- :: %1=要得到第几个参数
- :: %2=%*
- :getarg
- setlocal enabledelayedexpansion
- set /a num=%1-1
- for /l %%i in (1,1,!num!) do shift /2
- exit /b %2
- ::*******************************************************************************
- ::*******************************************************************************
- :: 根据参数填写符号和数字
- :: %1=Result %2=N1 %3=N2 %4=N3 %5=N4 %6=N5 %7=符号[1-4][1-4][1-4]
- :showresult
- setlocal enabledelayedexpansion
- set msg=%2
- for /l %%i in (1,1,4) do (
- set /a t=1
- set /a k=4-%%i
- for /l %%j in (1,1,!k!) do (
- set /a t=!t!*10
- )
- set /a t=%7/t
- set /a t=t%%10
- if !t!==1 (
- set msg=!msg! +
- )
- if !t!==2 (
- set msg=!msg! -
- )
- if !t!==3 (
- set msg=!msg! *
- )
- if !t!==4 (
- set msg=!msg! /
- )
- set /a t=%%i+2
- call :getarg !t! %*
- set msg=!msg! !errorlevel!
- )
- echo !msg! = %1
- exit /b
- ::*******************************************************************************
复制代码
[ 本帖最后由 sonic_andy 于 2008-2-9 10:48 编辑 ] |