| @echo off &setlocal enabledelayedexpansion |
| title made by 523066680@www.cn-dos.net - 算24.bat |
| :::::::::::::::::::::::::::::::::::: |
| ::批处理算24.bat |
| ::作者:523066680 |
| ::blog http://hi.baidu.com/523066680 |
| ::首发于:http://www.cn-dos.net/forum/viewthread.php?tid=45488&fpage=1 |
| :::::::::::::::::::::::::::::::::::: |
| :input |
| for /f "tokens=1 delims==" %%a in ('set') do (set "%%a=") |
| set "pexit=&pause &cls &goto :input" |
| set /a i=10,j=11,q=12,k=13 |
| set _+=- |
| set _-=+ |
| set _*=/ |
| set _/=* |
| echo, &echo, 算24.bat |
| echo, &echo, 输入4个扑克牌的数字,[范围: 1 2 3 4 5 6 7 8 9 i j q k ] |
| echo, &echo, 其中1-9代表1-9 , i代表10 , j代表11 , q代表12 , k代表13 |
| echo, &echo,请正确输入。 示例: q q 1 2 (或者qq12) |
| echo, &set /p "str=可以用空格隔开,也可以不用 [exit 退出]: " |
| echo, |
| if "%str%"=="" (cls &goto :input) |
| if "%str%"=="exit" (exit) |
| call :fo "%str: =%" "" |
| if "%have%"=="" (echo, &echo,没有答案) |
| echo, |
| pause |
| cls &goto :input |
| :://////递进结合递归//////列举数字的排列组合////// |
| :fo |
| if %1=="" ( |
| if not "!defx%~2!"=="def" (call :next %~2 &set defx%~2=def) |
| goto :eof |
| ) |
| if not defined _%~1 (set _%~1=-1) |
| set str=%~1 |
| :foa |
| set /a _%~1+=1,foa=_%~1,fob=foa+1 |
| call :fo "!str:~0,%foa%!!str:~%fob%!" "%~2!str:~%foa%,1!" |
| set str=%~1 |
| set /a foa=_%~1 |
| if not "!str:~%foa%,-1!"=="" (goto :foa) |
| set "_%~1=" |
| goto :eof |
| :://////组合运算符的所有排列形式//////对接收到的4个数字进行计算 |
| :next |
| set num=%~1 |
| set /a na=%num:~0,1%,nb=%num:~1,1%,nc=%num:~2,1%,nd=%num:~3,1% |
| set /a yn=nb*100/nc*nc,yn2=24*nb/nc*nc-24*nb |
| set "do=::" |
| if %yn% equ %nb%00 (set "do=") |
| %do% set /a spea=(na*10-nb*10/nc)*nd,speb=(na*10+nb*10/nc)*nd |
| %do% if %spea% equ 240 echo, [ %na% - %nb% / %nc% ] * %nd% = 24 &set have=have %pexit% |
| %do% if %speb% equ 240 echo, [ %na% + %nb% / %nc% ] * %nd% = 24 &set have=have %pexit% |
| set /a spec=(na-(nb*nc))*nd |
| if %spec% equ 24 echo, [ %na% - %nb% * %nc% ] * %nd% = 24 &set have=have %pexit% |
| if %yn2% equ 0 (set "do=") else (set "do=::") |
| %do% set /a spef=24*nb/nc-24*nd,speg=-spef |
| %do% if %spef% equ %na% echo, %na% / [ %nb% / %nc% - %nd% ] = 24 &set have=have %pexit% |
| %do% if %speg% equ %na% echo, %na% / [ %nd% - %nb% / %nc% ] = 24 &set have=have %pexit% |
| set "fu=+ - x /" |
| for %%a in (%fu%) do ( |
| for %%b in (%fu%) do ( |
| for %%c in (%fu%) do ( |
| set "fa=%%a" &set "fb=%%b" &set "fc=%%c" |
| call :next-1 !fa:x=*! !fb:x=*! !fc:x=*! |
| ) |
| ) |
| ) |
| goto :eof |
| :next-1 |
| set /a count=((na %1 nb) %2 nc) %3 nd |
| set "do=::" |
| if %count% equ 24 (set "do=") |
| ::////通过逆运算检验答案,例如,批处理中 3/2 = 1 而 1*2 不等于 3。 |
| %do% set /a test=((count !_%3! nd) !_%2! nc) !_%1! nb |
| %do% if %test% neq %na% (goto :next-2) |
| if %count% equ 24 (echo, { [%na% %1 %nb%] %2 %nc% } %3 %nd% = 24 &set have=have %pexit%) |
| :next-2 |
| set /a ca=na %1 nb,cb=nc %3 nd,pca=ca !_%1! nb,pcb=cb !_%3! nd |
| if %cb% equ 0 (goto :eof) |
| if %pca% neq %na% (goto :eof) |
| if %pcb% neq %nc% (goto :eof) |
| set /a count2=ca %2 cb,pcount2=count2 !_%2! cb |
| if %pcount2% neq %ca% (goto :eof) |
| if %count2% equ 24 (echo, [%na% %1 %nb%] %2 [%nc% %3 %nd%] = 24 &set have=have %pexit%)COPY |