@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%)
@echo off &setlocal enabledelayedexpansion
title made by 523066680@[url]www.cn-dos.net[/url] - 算24.bat 尽量列举版
::::::::::::::::::::::::::::::::::::
::批处理算24.bat 尽量列举版
::作者:523066680
::blog [url]http://hi.baidu.com/523066680[/url]
::首发于:[url]http://www.cn-dos.net/forum/viewthread.php?tid=45488&fpage=1[/url]
::::::::::::::::::::::::::::::::::::
:input
for /f "tokens=1 delims==" %%a in ('set') do (set "%%a=")
set "pexit=&echo,"
set /a i=10,j=11,q=12,k=13
set _+=-
set _-=+
set _*=/
set _/=*
echo, &echo, 很多时候答案有重复,因为是对数字和运算符排列...
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%)
附件 1:523066680作品.rar (2009-1-10 14:51, 85.04 KiB, 下载附件所需积分 1点 ,下载次数: 31)
Originally posted by 523066680 at 2009-1-25 18:12: 真受不了呢…… 这样的水贴……所以说呢,哈哈,我扣你分
回复:【精品】我也来写批处理 ... @echo off setlocal enableextensions enabledelayedexpansion title 作者:liuzhaonan11 echo 批处理算24点&echo. :loop set /p "n=输入四个数用空格分开: " set /a "lzn=0" for %%i in (!n!) do set /a "lzn+=1"&set /a "lz!lzn!z=%%i,lz!lzn!m=1,lz!lzn!s=%%i" call:liuzhaonan11 lz if not errorlevel 1 echo 结果: 没有答案 goto loop 原理说明:使用有理数进行计算,选择算式中最先结合的两数和它们之间的运算,并递归. :liuzhaonan11 setlocal set "f1=+"&set "f2=-"&set "f3=*"&set "f4=/" for /l %%i in (1,1,!%1n!) do for /l %%j in (1,1,!%1n!) do if %%i neq %%j ( for /l %%k in (1,1,4) do ( setlocal if %%k leq 2 set /a "z=%1%%jz*%1%%im!f%%k!%1%%jm*%1%%iz,m=%1%%jm*%1%%im" if %%k equ 3 set /a "z=%1%%jz*%1%%iz,m=%1%%jm*%1%%im" if %%k equ 4 set /a "z=%1%%jz*%1%%im,m=%1%%jm*%1%%iz" if !%1n! equ 2 ( set /a "t=!z!-24*!m!" if !t! equ 0 if !m! neq 0 echo 结果: !%1%%js! !f%%k! !%1%%is! = 24&exit /b 1 ) else ( set "s=(!%1%%js! !f%%k! !%1%%is!)"&set /a "n=0" for /l %%l in (1,1,!%1n!) do if %%l neq %%i if %%l neq %%j ( set /a "n+=1"&set "%1!n!z=!%1%%lz!"&set "%1!n!m=!%1%%lm!"&set "%1!n!s=!%1%%ls!" ) set /a "n+=1"&set "%1!n!z=!z!"&set "%1!n!m=!m!"&set "%1!n!s=!s!" set "%1n=!n!"&call%0 %1 if errorlevel 1 exit /b 1 ) endlocal ) ) exit /b 0 作者:liuzhaonan11 2009-1-11 17:17 回复此发言 --------------------------------------------------------------------------------