标题: 如何利用批处理解决这个数学问题(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
-
- :: 思路如下
- :: 实际上加减乘除是一个树形遍历的问题
- :: 可以使用递归的方式来解决
- :: 暂时没有考虑到算符的优先级,按照从左到右的顺序执行计算
- @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 编辑 ]
作者: 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不能处理小数 没有更好的解决办法 暂时不用除法 所以有局限性 看看高手怎么解决吧
上来改个代码
- @echo off&setlocal enabledelayedexpansion
- set/p var=输入4个数(空格隔开)
- for %%i in (!var!) do set/a n+=1&set !n!=%%i
- set m1=+&set m2=-&set m3=*
- for /l %%i in (1 1 %n%) do (
- for /l %%j in (1 1 %n%) do (
- for /l %%k in (1 1 %n%) do (
- for /l %%l in (1 1 %n%) do (
- if not "%%i"=="%%j" (
- if not "%%i"=="%%k" (
- if not "%%i"=="%%l" (
- if not "%%j"=="%%k" (
- if not "%%j"=="%%l" (
- if not "%%l"=="%%k" (
- if not defined %%i%%j%%k%%l set %%i%%j%%k%%l=ok&(
- for /l %%a in (1,1,3) do (
- for /l %%b in (1,1,3) do (
- for /l %%c in (1,1,3) do (
- set/a str=!%%i!!m%%a!!%%j!!m%%b!!%%k!!m%%c!!%%l!
- if "!str!" == "24" echo !%%i!!m%%a!!%%j!!m%%b!!%%k!!m%%c!!%%l!=!str!&exit
-
- set/a str=^(!%%i!!m%%a!!%%j!^)!m%%b!!%%k!!m%%c!!%%l!
- if "!str!" == "24" set/p=^(!%%i!!m%%a!!%%j!^)!m%%b!!%%k!!m%%c!!%%l!=!str!&exit
-
- set/a str=!%%i!!m%%a!^(!%%j!!m%%b!!%%k!^)!m%%c!!%%l!
- if "!str!" == "24" set/p=!%%i!!m%%a!^(!%%j!!m%%b!!%%k!^)!m%%c!!%%l!=!str!&exit
-
- set/a str=!%%i!!m%%a!!%%j!!m%%b!^(!%%k!!m%%c!!%%l!^)
- if "!str!" == "24" set/p=!%%i!!m%%a!!%%j!!m%%b!^(!%%k!!m%%c!!%%l!^)=!str!&exit
-
- set/a str=^(!%%i!!m%%a!!%%j!!m%%b!!%%k!^)!m%%c!!%%l!
- if "!str!" == "24" set/p=^(!%%i!!m%%a!!%%j!!m%%b!!%%k!^)!m%%c!!%%l!=!str!&exit
-
- set/a str=!%%i!!m%%a!^(!%%j!!m%%b!!%%k!!m%%c!!%%l!^)
- if "!str!" == "24" set/p=!%%i!!m%%a!^(!%%j!!m%%b!!%%k!!m%%c!!%%l!^)=!str!&exit
-
- set/a str=^(!%%i!!m%%a!!%%j!^)!m%%b!^(!%%k!!m%%c!!%%l!^)
- if "!str!" == "24" set/p=^(!%%i!!m%%a!!%%j!^)!m%%b!^(!%%k!!m%%c!!%%l!^)=!str!&exit
-
- set/a str=^(!%%i!!m%%a!^(!%%j!!m%%b!!%%k!^)^)!m%%c!!%%l!
- if "!str!" == "24" set/p=^(!%%i!!m%%a!^(!%%j!!m%%b!!%%k!^)^)!m%%c!!%%l!=!str!&exit
-
- set/a str=^(^(!%%i!!m%%a!!%%j!^)!m%%b!!%%k!^)!m%%c!!%%l!
- if "!str!" == "24" set/p=^(^(!%%i!!m%%a!!%%j!^)!m%%b!!%%k!^)!m%%c!!%%l!=!str!&exit
-
- set/a str=!%%i!!m%%a!^(!%%j!!m%%b!^(!%%k!!m%%c!!%%l!^)^)
- if "!str!" == "24" set/p=!%%i!!m%%a!^(!%%j!!m%%b!^(!%%k!!m%%c!!%%l!^)^)=!str!&exit
-
- set/a str=!%%i!!m%%a!^(^(!%%j!!m%%b!!%%k!^)!m%%c!!%%l!^)
- if "!str!" == "24" set/p=!%%i!!m%%a!^(^(!%%j!!m%%b!!%%k!^)!m%%c!!%%l!^)=!str!&exit
- ))))))))))))))
- echo.
- echo 对不起,没算出来!
- echo.
- pause
复制代码
[ 本帖最后由 terse 于 2008-8-4 12:43 编辑 ]
作者: xiong8707 时间: 2008-12-25 22:47 标题: 有BUG哦
输入 同样的数字 会发生不计算的错误
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |