标题: [文本处理] [已解决]批处理求1-10数字,5个一组,每组数据不相同并>a.txt [打印本页]
作者: wxyz0001 时间: 2019-10-27 12:48 标题: [已解决]批处理求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的批处理格式编写的代码
===============完美解决===================- @echo off&setlocal enabledelayedexpansion
- set " var=01 02 03 04 05 06 07 08 09 10"
- set "m=5"
- for %%i in (%var%) do (
- set /a n+=1&set #!n!=%%i
- if !n! leq !m! (set s=1!s!)else set s=!s!0
- )
- set/a r=n-m,i=j=1
- for /l %%i in (1,1,%r%) do set /a "i*=(n-%%i+1),j*=%%i"
- set s=0!s!&set /a "i/=j"
- (for /l %%i in (1 1 !i!) do (
- for /l %%j in (1 1 !n!) do (
- if "!s:~%%j,1!" == "1" set $=!$!,!#%%j!
- )
- for /f %%a in ("!s:10= !") do set "j=%%a"
- set s=0!j:0=!!j:1=!1!s:*10=!
- echo!$!&set "$="
- ))>$#.t
- sort $#.t /o a.txt
- del $#.t
- pause
复制代码
上面这段代码var字符数组可以根据需要设定没有规律的数字,是这段代码最大的优点
___________________________________- @echo off&setlocal enabledelayedexpansion
- set /a N=10,R=5,S=N-R,i=1,j=1
- for /l %%i in (1 1 %N%) do (
- if %%i lss 10 (set _%%i=0%%i) else set _%%i=%%i
- )
- for /l %%i in (1,1,%S%) do set /a "i*=(N-%%i+1),j*=%%i"
- set /a i/=j
- for /l %%i in (1 1 %R%) do set /a A%%i=%%i,B%%i=%%i+S&set #=!#!,!_%%i!
- echo!#!
- for /l %%a in (2 1 !I!) do (
- set "#="
- for /l %%i in (1 1 !R!) do if not #!A%%i! == #!B%%i! set M=%%i
- for %%i in (!M!) do (
- set L=!A%%i!
- for /l %%j in (1 1 %R%) do (
- if %%j geq %%i set/a A%%j=L+1,L=A%%j
- set #=!#! !A%%j!
- )
- )
- for %%i in (!#!) do set emp=!emp!,!_%%i!
- echo!emp!&set emp=
- )>>a.txt
- echo 总 !i! 组
- pause
复制代码
作者: WHY 时间: 2019-10-27 16:02
本帖最后由 WHY 于 2019-10-27 16:53 编辑
- @echo off & setlocal enabledelayedexpansion
- for /L %%i in (101 1 110) do set "str=!str! %%i"
- (for /L %%i in (1 1 20000) do (
- set "strTmp=!str!"
- set "strOut="
- for /L %%j in (0 1 4) do (
- set /a "n = !Random! %% (10 - %%j), a = n * 4, b = a + 4"
- for /f "tokens=1,2" %%x in ("!a! !b!") do (
- set "s=!strTmp:~%%x,4!"
- set "strTmp=!strTmp:~0,%%x!!strTmp:~%%y!"
- )
- set "strOut=!strOut!!s:~-2!,"
- )
- echo;!strOut:~0,-1!
- )) > a.Log
- pause
复制代码
作者: wxyz0001 时间: 2019-10-27 17:00
回复 2# WHY
谢谢回复,程序可以运行,但是可以按顺序来排吗
作者: terse 时间: 2019-10-27 17:06
这个论坛发过的吧- @echo off&setlocal enabledelayedexpansion
- set /a N=10,R=5,S=N-R,i=1,j=1
- for /l %%i in (1 1 %N%) do (
- if %%i lss 10 (set _%%i=0%%i ) else set _%%i=%%i
- )
- for /l %%i in (1,1,%S%) do set /a "i*=(N-%%i+1),j*=%%i"
- set /a i/=j
- for /l %%i in (1 1 %R%) do set /a A%%i=%%i,B%%i=%%i+S&set #=!#!,!_%%i!
- echo!#!
- for /l %%a in (2 1 !I!) do (
- set "#="
- for /l %%i in (1 1 !R!) do if not #!A%%i! == #!B%%i! set M=%%i
- for %%i in (!M!) do (
- set L=!A%%i!
- for /l %%j in (1 1 %R%) do (
- if %%j geq %%i set/a A%%j=L+1,L=A%%j
- set #=!#! !A%%j!
- )
- )
- for %%i in (!#!) do set emp=!emp!,!_%%i!
- echo!emp!&set emp=
- )
- echo 总 !i! 组
- pause
复制代码
作者: wxyz0001 时间: 2019-10-27 17:16
本帖最后由 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,赞
@
作者: terse 时间: 2019-10-27 18:56
回复 5# wxyz0001
相对来说 这个效率应该还高点 虽然代码处理结果排序不一样 多了一个处理命令- @echo off&setlocal enabledelayedexpansion
- set " var=01 02 03 04 05 06 07 08 09 10"
- set "m=5"
- for %%i in (%var%) do (
- set /a n+=1&set #!n!=%%i
- if !n! leq !m! (set s=1!s!)else set s=!s!0
- )
- set/a r=n-m,i=j=1
- for /l %%i in (1,1,%r%) do set /a "i*=(n-%%i+1),j*=%%i"
- set s=0!s!&set /a "i/=j"
- (for /l %%i in (1 1 !i!) do (
- for /l %%j in (1 1 !n!) do (
- if "!s:~%%j,1!" == "1" set $=!$!,!#%%j!
- )
- for /f %%a in ("!s:10= !") do set "j=%%a"
- set s=0!j:0=!!j:1=!1!s:*10=!
- echo!$!&set "$="
- ))>$#.t
- sort $#.t /o a.txt
- del $#.t
- pause
复制代码
作者: WHY 时间: 2019-10-27 20:30
就题解题,5 个 for 搞它- @echo off & setlocal enabledelayedexpansion
- (for /L %%i in (101 1 106) do (
- set /a n=%%i+1
- for /L %%j in (!n! 1 107) do (
- set /a n=%%j+1
- for /L %%k in (!n! 1 108) do (
- set /a n=%%k+1
- for /L %%l in (!n! 1 109) do (
- set /a n=%%l+1
- for /L %%m in (!n! 1 110) do set "s=,%%i,%%j,%%k,%%l,%%m" & set "s=!s:,1=,!" & echo!s!
- )
- )
- )
- )) > a.Log
- pause
复制代码
作者: wxyz0001 时间: 2019-10-30 12:35
回复 7# WHY
谢谢回复
作者: WHY 时间: 2019-10-30 21:55
回复 8# wxyz0001
你还不如假装没看见的好。
给你答案的人一多,你就开始飘了,挑三拣四的。好像别人都差你钱似的,下次你的问题没人鸟你,让你再飘高一点。
作者: wxyz0001 时间: 2019-10-31 01:15
回复 9# WHY
我又没说你什么,还说谢谢回复了,你莫名其妙发脾气!怪人!
作者: Gin_Q 时间: 2019-11-2 19:16
回复 4# terse
后面看得我脑袋疼,有没有详细的分析链接。求发一个!!
作者: wxyz0001 时间: 2019-11-4 16:33
本帖最后由 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写出完美的代码
____________________________________________________________
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |