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

[文本处理] [已解决]批处理求1-10数字,5个一组,每组数据不相同并>a.txt

本帖最后由 wxyz0001 于 2019-10-30 12:46 编辑

求1-10数字,5个一组,每组数据不相同并>a.txt
输出后结果:
01,02,03,04,05
01,02,03,04,06
01,02,03,04,07
01,02,03,04,08
01,02,03,04,09
01,02,03,04,10
01,02,03,05,06
01,02,03,05,07
01,02,03,05,08
......


要求XP的批处理格式编写的代码

===============完美解决===================
  1. @echo off&setlocal enabledelayedexpansion
  2. set " var=01 02 03 04 05 06 07 08 09 10"
  3. set "m=5"
  4. for %%i in (%var%) do (
  5.     set /a n+=1&set #!n!=%%i
  6.     if !n! leq !m! (set s=1!s!)else set s=!s!0
  7. )
  8. set/a r=n-m,i=j=1
  9. for /l %%i in (1,1,%r%) do set /a "i*=(n-%%i+1),j*=%%i"
  10. set s=0!s!&set /a "i/=j"
  11. (for /l %%i in (1 1 !i!) do (
  12.     for /l %%j in (1 1 !n!) do (
  13.         if "!s:~%%j,1!" == "1" set $=!$!,!#%%j!
  14.     )
  15.            for /f %%a in ("!s:10= !") do set "j=%%a"
  16.            set s=0!j:0=!!j:1=!1!s:*10=!
  17.            echo!$!&set "$="
  18. ))>$#.t
  19. sort $#.t /o a.txt
  20. del $#.t
  21. pause
复制代码
上面这段代码var字符数组可以根据需要设定没有规律的数字,是这段代码最大的优点
___________________________________
  1. @echo off&setlocal enabledelayedexpansion
  2. set /a N=10,R=5,S=N-R,i=1,j=1
  3. for /l %%i in (1 1 %N%) do (
  4.      if %%i lss 10 (set _%%i=0%%i) else set _%%i=%%i
  5. )
  6. for /l %%i in (1,1,%S%) do set /a "i*=(N-%%i+1),j*=%%i"
  7. set /a i/=j
  8. for /l %%i in (1 1 %R%) do set /a A%%i=%%i,B%%i=%%i+S&set #=!#!,!_%%i!
  9. echo!#!
  10. for /l %%a in (2 1 !I!) do (
  11.     set "#="
  12.     for /l %%i in (1 1 !R!) do if not #!A%%i! == #!B%%i! set M=%%i
  13.     for %%i in (!M!) do (
  14.         set L=!A%%i!
  15.         for /l %%j in (1 1 %R%) do (
  16.             if %%j geq %%i set/a A%%j=L+1,L=A%%j
  17.             set #=!#! !A%%j!
  18.         )
  19.     )
  20.     for %%i in (!#!) do set emp=!emp!,!_%%i!
  21.     echo!emp!&set emp=
  22. )>>a.txt
  23. echo 总 !i! 组
  24. pause
复制代码
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

本帖最后由 wxyz0001 于 2019-11-4 17:17 编辑

回复 11# Gin_Q


    代码看上去是有些复杂,但是只要熟练了字符串运算就容易看明白,不过我还没看出来这样排序的规律
for /l %%i in (1,1,%r%) do set /a "i*=(n-%%i+1),j*=%%i"
set s=0!s!&set /a "i/=j"
这里排列组合c[10,5]的公式以及s的值前加个0,
之前s经过if !n! leq !m! (set s=1!s!)else set s=!s!0
运算后s=111110000
而到set s=0!s!&set /a "i/=j"这里后
s=01111100000
接着 if "!s:~%%j,1!" == "1" set $=!$!,!#%%j!这一步
当s里面是1的时候,就把#!n!里所指向的值输出给$,有几个1就把#!n!所指向的值依次按逗号隔开输出给$,
代码运行到for /f %%a in ("!s:10= !") do set "j=%%a"这里,
就是把s里面保留4个1,另外一个1的值出现的位置每次都保持不同。
s=01111100000经过!s:10= !字符串运算,就是把第一次出现10的字符赋值为空,
值为空后的s=01111 0000就是这样的,
for /f默认只取第一个数据,空格之后是第二段数据,也就弃之不用了
所以这时候set "j=%%a"就是j=01111了
但是s的值不变,只是取出s的值截取一部分赋值给j,
最关键的是这步set s=0!j:0=!!j:1=!1!s:*10=!
我只知道这步是怎么运算的,至于这样运算的规律我还没看出来
现在把运算过程写下来
当前s的值是01111100000,j的值是01111
经过set s=0!j:0=!!j:1=!1!s:*10=!运算式,
把他们代进去就容易得出运算后的值,代入如下:
s=01111100000
j=01111
s=0!j:0=!(01111:0=)!j:1=!(01111:1=)1!s:*10(01111100000:*10=)=!计算后
s=0(有0的删除后=1111)(有1的删除后=0)1(10字符串以及10前面的字符串删除=0000)
s=01111010000
标示红色的字直接代入到其相应的位置,
()中就是把j的值、s的值代入进去进行字符串运算,这样容易看明白吧
最后s得出的值就是s=01111010000
这样s经过运算,0之后第5个值是1的就为0,0位置所指向的值就不输出,0之后第6个值为1就输出所指向的值
我能看清这个代码的运算过程得助于版主@Batcher的耐心解释,也感谢@terse写出完美的代码


____________________________________________________________

TOP

回复 4# terse


    后面看得我脑袋疼,有没有详细的分析链接。求发一个!!

TOP

回复 9# WHY


    我又没说你什么,还说谢谢回复了,你莫名其妙发脾气!怪人!

TOP

回复 8# wxyz0001


    你还不如假装没看见的好。
给你答案的人一多,你就开始飘了,挑三拣四的。好像别人都差你钱似的,下次你的问题没人鸟你,让你再飘高一点。

TOP

回复 7# WHY
谢谢回复

TOP

就题解题,5 个 for 搞它
  1. @echo off & setlocal enabledelayedexpansion
  2. (for /L %%i in (101 1 106) do (
  3.     set /a n=%%i+1
  4.     for /L %%j in (!n! 1 107) do (
  5.         set /a n=%%j+1
  6.         for /L %%k in (!n! 1 108) do (
  7.             set /a n=%%k+1
  8.             for /L %%l in (!n! 1 109) do (
  9.                 set /a n=%%l+1
  10.                 for /L %%m in (!n! 1 110) do set "s=,%%i,%%j,%%k,%%l,%%m" & set "s=!s:,1=,!" & echo!s!
  11.             )
  12.         )
  13.     )
  14. )) > a.Log
  15. pause
复制代码

TOP

回复 5# wxyz0001
相对来说 这个效率应该还高点 虽然代码处理结果排序不一样 多了一个处理命令
  1. @echo off&setlocal enabledelayedexpansion
  2. set " var=01 02 03 04 05 06 07 08 09 10"
  3. set "m=5"
  4. for %%i in (%var%) do (
  5.     set /a n+=1&set #!n!=%%i
  6.     if !n! leq !m! (set s=1!s!)else set s=!s!0
  7. )
  8. set/a r=n-m,i=j=1
  9. for /l %%i in (1,1,%r%) do set /a "i*=(n-%%i+1),j*=%%i"
  10. set s=0!s!&set /a "i/=j"
  11. (for /l %%i in (1 1 !i!) do (
  12.     for /l %%j in (1 1 !n!) do (
  13.         if "!s:~%%j,1!" == "1" set $=!$!,!#%%j!
  14.     )
  15.            for /f %%a in ("!s:10= !") do set "j=%%a"
  16.            set s=0!j:0=!!j:1=!1!s:*10=!
  17.            echo!$!&set "$="
  18. ))>$#.t
  19. sort $#.t /o a.txt
  20. del $#.t
  21. pause
复制代码
1

评分人数

TOP

本帖最后由 wxyz0001 于 2019-10-27 18:06 编辑

回复 4# terse

厉害!按要求来,而且运行很快
for /l %%i in (1 1 %N%) do (
     if %%i lss 10 (set _%%i=0%%i ) else set _%%i=%%i
)
这个是小于10的数前面加0,



@

TOP

这个论坛发过的吧
  1. @echo off&setlocal enabledelayedexpansion
  2. set /a N=10,R=5,S=N-R,i=1,j=1
  3. for /l %%i in (1 1 %N%) do (
  4.      if %%i lss 10 (set _%%i=0%%i ) else set _%%i=%%i
  5. )
  6. for /l %%i in (1,1,%S%) do set /a "i*=(N-%%i+1),j*=%%i"
  7. set /a i/=j
  8. for /l %%i in (1 1 %R%) do set /a A%%i=%%i,B%%i=%%i+S&set #=!#!,!_%%i!
  9. echo!#!
  10. for /l %%a in (2 1 !I!) do (
  11.     set "#="
  12.     for /l %%i in (1 1 !R!) do if not #!A%%i! == #!B%%i! set M=%%i
  13.     for %%i in (!M!) do (
  14.         set L=!A%%i!
  15.         for /l %%j in (1 1 %R%) do (
  16.             if %%j geq %%i set/a A%%j=L+1,L=A%%j
  17.             set #=!#! !A%%j!
  18.         )
  19.     )
  20.     for %%i in (!#!) do set emp=!emp!,!_%%i!
  21.     echo!emp!&set emp=
  22. )
  23. echo 总 !i! 组
  24. pause
复制代码
1

评分人数

TOP

回复 2# WHY

谢谢回复,程序可以运行,但是可以按顺序来排吗

TOP

本帖最后由 WHY 于 2019-10-27 16:53 编辑
  1. @echo off & setlocal enabledelayedexpansion
  2. for /L %%i in (101 1 110) do set "str=!str! %%i"
  3. (for /L %%i in (1 1 20000) do (
  4.     set "strTmp=!str!"
  5.     set "strOut="
  6.     for /L %%j in (0 1 4) do (
  7.         set /a "n = !Random! %% (10 - %%j), a = n * 4, b = a + 4"
  8.         for /f "tokens=1,2" %%x in ("!a! !b!") do (
  9.             set "s=!strTmp:~%%x,4!"
  10.             set "strTmp=!strTmp:~0,%%x!!strTmp:~%%y!"
  11.         )
  12.         set "strOut=!strOut!!s:~-2!,"
  13.     )
  14.     echo;!strOut:~0,-1!
  15. )) > a.Log
  16. pause
复制代码

TOP

返回列表