返回列表 发帖

如何利用批处理解决这个数学问题(4个数字间填入符号后等于某个数字)

比如说有这四个数字
7 5 6 9 3
要在每个数间填入符号+ - * /
使上式等于6
ㄗs:A good programming is 99% sweat and 1% coffee!--①個亾

============ >   hi.baidu.com/novaa   <============

这个题目 有点点难度(似乎我原来发过类似的),组合的可能性好多啊

TOP

还是人工来好了,哈哈。
(7- 5)×[6 -(9/3)]=6

TOP

呵呵
闲着不想做事情
就想P可以做些什么
想起以前C#里面的题目
很多都已经嘿你们用P做了
想到这个好像没有就发上来了
ㄗs:A good programming is 99% sweat and 1% coffee!--①個亾

============ >   hi.baidu.com/novaa   <============

TOP

这个太难了,牵扯到除法问题,括弧问题.
组合太多了.
技术问题请到论坛发帖求助!

TOP

可以做得出来吗?
有难度

TOP

:time: :time: :time: :time: :time: :time:
1

评分人数

@echo off
@cls

TOP

:: 思路如下
:: 实际上加减乘除是一个树形遍历的问题
:: 可以使用递归的方式来解决
:: 暂时没有考虑到算符的优先级,按照从左到右的顺序执行计算
@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
::*******************************************************************************COPY

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

评分人数

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

TOP

楼上兄弟的功底不错嘛

TOP

呵呵,管理员过奖了。

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

TOP

这样的局限性太小了,如果能写出个算24点的就好了.

TOP

我是写了一个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.
pauseCOPY

[ 本帖最后由 terse 于 2008-8-4 12:43 编辑 ]
2

评分人数

    • more: PB + 2
    • youxi01: 呵呵,还不错!!精华 + 2 + 2 PB + 15

TOP

有BUG哦

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

TOP

返回列表