[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 523066680 于 2011-5-21 12:39 编辑

在cn-dos做过
arrangement
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /p inp="仅支持排列几个普通字符,不要乱输哦:"
  4. call :func "%inp%" ""
  5. pause
  6. exit
  7. :func
  8. if "%~1"=="" (echo _%~2 &goto :eof)
  9. setlocal
  10. set strnow=%~1
  11. set /a lp=0,lpb=lp+1
  12. :lp
  13.   call :func "!strnow:~0,%lp%!!strnow:~%lpb%!" "%~2!strnow:~%lp%,1!"
  14.   if not "!strnow:~%lpb%!"=="" (
  15.    set /a lp+=1,lpb=lp+1
  16.    goto :lp
  17.   )
  18. endlocal
复制代码
combination
  1. @echo off
  2. call :func "abcd" ""
  3. pause &exit
  4. :func
  5. setlocal
  6. if %1=="" (
  7.     if not %2=="" (echo %2)
  8.     goto :eof
  9. )
  10. set strnow=%~1
  11.    call :func "%strnow:~1%" "%~2%strnow:~0,1%"
  12.    call :func "%strnow:~1%" "%~2"
  13. endlocal
复制代码
本来利用批处理可以用变量作为语句执行的特点可以用变量构造多层for ,这样速度很快。
但是排列方面整起来不容易,组合的话倒可以:
  1. @echo off &setlocal enabledelayedexpansion
  2. set element=a b c
  3. :gettitle
  4. for %%x in (%element%) do (
  5.   set "fo=for %%%%x in ("%%x" "") do (!fo!"
  6.   set end="!end!)"
  7.   set result=!result!%%~%%x
  8. )
  9. %fo%
  10.   echo "%result%"
  11. %end:"=%
  12. pause
复制代码
1

评分人数

TOP

哪位能把for 语句构造到变量里边去,然后替换执行的。
会很有戏哦
@echo off
for %%a in (a b c) do (
for %%b in (a b c) do (
for %%c in (a b c) do (
        if not %%a==%%b (
        if not %%b==%%c (
        if not %%a==%%c (
        echo %%a%%b%%c
        )))
)))
pause
)

TOP

本帖最后由 523066680 于 2019-3-17 12:58 编辑

回复 35# ahighhand

26选3
组合
  1. @echo off
  2. call :func "abcdefghijklmnopqrstuvwxyz" "" 0
  3. pause &exit
  4. :func
  5.     setlocal
  6.     set /a v=%3
  7.     if %v% equ 3 (echo %~2 &goto :eof)
  8.     if %1  == "" (goto :eof)
  9.     set strnow=%~1
  10.     call :func "%strnow:~1%" "%~2%strnow:~0,1%" %v%+1
  11.     call :func "%strnow:~1%" "%~2" %v%
  12.     endlocal
复制代码
排列
  1. @echo off &setlocal enabledelayedexpansion
  2. set alphabet=abcdefghijklmnopqrstuvwxyz
  3. for /l %%a in (0,1,25) do set eles=!eles! !alphabet:~%%a,1!
  4. call :func "%eles%" "" 0
  5. pause &exit
  6. :func
  7.     setlocal
  8.     set /a v=%3
  9.     if %v% equ 3 ( echo %~2 &goto :eof)
  10.     set eles=%~1
  11.     for %%a in ( %eles% ) do call :func "!eles:%%a=!" "%~2%%a" %v%+1
  12.     endlocal
复制代码

TOP

本帖最后由 523066680 于 2019-3-17 23:26 编辑

回复 37# 老刘1号

    那个帖子,我转发了一段迭代解法(摘自《高阶Perl》),若想要第N个结果、或者想要从第N个排列开始排,可以直接算,而不需要从头开始。
不过没什么人留意
http://www.bathome.net/redirect. ... 3749&pid=198745
http://www.code-by.org/viewtopic.php?p=814#p814

如果做多线程并行,这种迭代法就很好用,8核的CPU,8线程分别从不同的起点开始迭代。
如果是跑GPU,并发量就更大了,若是简单的加密应该可以利用这种方法,大量并发加速碰撞。

TOP

返回列表