Board logo

标题: [数值计算] [已解决]批处理循环输出排列组合提示语法错误 [打印本页]

作者: firewolf85    时间: 2009-11-13 09:14     标题: [已解决]批处理循环输出排列组合提示语法错误

请高手指点下我的代码哪里有问题,应该怎么改正。
  1. @echo off
  2. for /l %%i in (1 1 8) do (
  3. for /l %%j in (1 1 8) do (
  4. for /l %%k in (1 1 8) do (
  5. for /l %%l in (1 1 8) do (
  6. for /l %%m in (1 1 8) do (
  7. for /l %%n in (1 1 8) do (
  8. for /l %%o in (1 1 8) do (
  9. for /l %%p in (1 1 8) do (
  10. set /a a=%%i+%%j+%%k+%%l+%%m+%%n+%%o+%%p
  11. if not %a == 36 goto :next
  12. set /a b=%%i*%%j*%%k*%%l*%%m*%%n*%%o*%%p
  13. if not %b == 40320 goto :next
  14. echo %%i %%j %%k %%l %%m %%n %%o %%p
  15. :next
  16. )
  17. )
  18. )
  19. )
  20. )
  21. )
  22. )
  23. )
  24. pause
复制代码
这段代码是为了输出 1-8这8个数的全排列

[ 本帖最后由 firewolf85 于 2009-11-13 14:23 编辑 ]
作者: vsbat    时间: 2009-11-13 12:31

@echo off
setlocal enabledelayedexpansion  ::for 内部要变量延迟
for /l %%i in (1 1 8) do (
for /l %%j in (1 1 8) do (
for /l %%k in (1 1 8) do (
for /l %%l in (1 1 8) do (
for /l %%m in (1 1 8) do (
for /l %%n in (1 1 8) do (
for /l %%o in (1 1 8) do (
for /l %%p in (1 1 8) do (
set /a a=%%i+%%j+%%k+%%l+%%m+%%n+%%o+%%p
if not !a! == 36 goto :next                                                     ::for 内部要变量延迟
set /a b=%%i*%%j*%%k*%%l*%%m*%%n*%%o*%%p
if not !b! == 40320 goto :next                                                 ::for 内部要变量延迟
echo %%i %%j %%k %%l %%m %%n %%o %%p
:next
echo hello  ::不可无内容
)
)
)
)
)
)
)
)
pause

[ 本帖最后由 vsbat 于 2009-11-13 12:33 编辑 ]
作者: batman    时间: 2009-11-13 13:20

以前写的枚举输入字符组合的方法(注意非空字符不要超过9个):
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p num=请输入字符:
  3. set "num=%num: =%"&set "num=!num: =!"
  4. set "s=abcdefghijklnmopqrstuvwxyz"
  5. :lp
  6. set /a n+=1
  7. set "ss=%ss%str%n%"&set "k=%k%)"&set "str1=%str1% %n%"
  8. set "nums=%nums% %num:~,1%"&set "num=%num:~1%
  9. if defined num goto lp
  10. (echo ^@echo off^&setlocal enabledelayedexpansion
  11. echo cd.^>list.txt
  12. echo for %%%%a in ^(%nums%^) do set /a m+=1^&set "_^!m^!=%%%%a"
  13. echo set "str1=%str1%")>temp.bat
  14. for /l %%a in (1,1,%n%) do (
  15.      set "a=%%%%!s:~,1!"&set "b=!ss:~,4!"&set "c=!ss:~4,4!"
  16.      set "str=!str!^!_!a!^!"&if "!c!" equ "" set "c=flag"
  17.      echo for !a! in ^(^^^!!b!^^^!^) do ^(set "!c!=^!!b!:!a!=^!">>temp.bat
  18.      set "s=!s:~1!"&set "ss=!ss:~4!"
  19. )
  20. echo echo !str!^>^>list.txt>>temp.bat
  21. echo %k%>>temp.bat
  22. echo start list.txt^&del /q %%0>>temp.bat
  23. endlocal&temp.bat
复制代码

[ 本帖最后由 batman 于 2009-11-13 18:03 编辑 ]
作者: firewolf85    时间: 2009-11-13 13:53

感谢两位的热心帮助,二楼提出“echo hello  ::不可无内容”确实解决程序提示语法错误的问题,但是开启变量延迟后并没有解决最后正确结果的问题,希望各位大侠能有进一步的指点。或者说我这种思路在批处理中不能实现。三楼版主的代码试了,结果确实是我想要的,正在研究当中ING....

[ 本帖最后由 firewolf85 于 2009-11-13 13:56 编辑 ]
作者: batman    时间: 2009-11-13 13:59

for中是不能有goto循环的,只能跳转到外部循环
作者: firewolf85    时间: 2009-11-13 14:13

看来问题确实出在代码上,修改后的代码可以正确运行了,不过效率那个不怎么样。
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%i in (1 1 8) do (
  3. for /l %%j in (1 1 8) do (
  4. for /l %%k in (1 1 8) do (
  5. for /l %%l in (1 1 8) do (
  6. for /l %%m in (1 1 8) do (
  7. for /l %%n in (1 1 8) do (
  8. for /l %%o in (1 1 8) do (
  9. for /l %%p in (1 1 8) do (
  10. set /a a=%%i+%%j+%%k+%%l+%%m+%%n+%%o+%%p
  11. set /a b=%%i*%%j*%%k*%%l*%%m*%%n*%%o*%%p
  12. if !a! ==36 if !b! == 40320 echo %%i %%j %%k %%l %%m %%n %%o %%p
  13. )
  14. )
  15. )
  16. )
  17. )
  18. )
  19. )
  20. )
  21. pause
复制代码

作者: firewolf85    时间: 2009-11-13 14:15

刚在调试修改,没看到版主的回覆,原来是这样子啊,谢谢斑竹指点。
作者: batman    时间: 2009-11-13 23:18

变量嵌套+递归法解本题:
  1. @echo off&setlocal enabledelayedexpansion
  2. set "str1=1 2 3 4 5 6 7 8"
  3. call :lp 1
  4. start list.txt&goto :eof
  5. :lp
  6. for %%a in (!str%1!) do (
  7.     set "var%1=%%a"
  8.     if not defined _%1 set "var=!var!^!var%1^!"&set "_%1=a"
  9.     set /a n=%1+1&set "str!n!=!str%1:%%a=!"   
  10.     if "!n!" leq "8" (
  11.        call :lp !n!
  12.        ) else (
  13.        for %%a in (!var!) do echo %%a>>list.txt
  14.     )
  15. )
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2