尝试着用纯批处理写了段代码。
思路:
1、把每个集合展开,列举集合中的每一个数,分别放入临时文件A.txt和B.txt,并求出每一集合中的最大数值max_A和max_B;
2、求合集时:
① 先把展开的数据放入同一临时文件tmpAB.txt,以tmpAB.txt中每行数据为变量名的一部分,对变量 num_%%i 赋值,从而得到变量名合集;
② 求出max_A和max_B中的最大值max,然后,检测从1到max的变量 num_%%i 是否已被赋值,把已经赋值过的数字输出到临时文件tmpAB↑.txt,从而得到升序排列的A和B的交集数据文本;
③ 读取tmpAB↑.txt中的数据,按照格式输出A和B的和集表达式;
3、求A交非B的交集时:
① 读取B.txt,对每一行数据赋值,赋值方法同第2点第②小点,然后,从1到max_B列举数值,把那些没有赋值过的数据输出到临时文件 —B.txt ;
② 用 findstr /beg:—B.txt A.txt 得到按照升序排列的A交非B的数据文本 tmpA—B↑.txt
③ 按照格式输出交集表达式
使用限制:
1、应为使用了 set /a 操作,可处理的数值范围为 1~2^32-1;
2、因为通过判断变量是否被赋值来排序,而系统有变量名个数的限制,从而导致实际能检测到的数值范围进一步缩小,具体范围尚未测试出来。
代码:- @echo off
- set A={1,[3,6],10,[20,30],[32,60],[200,3000],5000,[6000,8000],9000,9500}
- set B={2,5,31,[300,500],[8000,9000],9500}
- md tmp 2>nul
- pushd tmp 2>nul||exit
- setlocal enabledelayedexpansion
-
- echo %time%
- call :expand_num A %A:~1,-1%
- call :expand_num B %B:~1,-1%
-
- set /p=A∪B={<nul
- call :A∪B A B
-
- :—B
- :: 生成非B集合数据文本
- for /f "delims==" %%i in ('set num_ 2^>nul') do set %%i=
- for /f %%i in (B.txt) do set num_%%i=0
- (for /l %%i in (1,1,%max_B%) do (
- if not defined num_%%i echo %%i
- ))>—B.txt
- findstr /beg:—B.txt A.txt>tmpA—B↑.txt
-
- set /p=A交非B={<nul
- call :format_str A —B
- popd
- pause
- exit
-
- :A∪B
- :: 合并两文本,对每个数值赋值,然后从1开始检测哪些数值已经被赋值,由小到大写入临时文件
- copy %1.txt+%2.txt tmp%1%2.txt>nul
- if %max_A% gtr %max_B% (
- set max=%max_A%
- ) else set max=%max_B%
- for /f "delims==" %%i in ('set num_ 2^>nul') do set %%i=
- for /f %%i in (tmp%1%2.txt) do set num_%%i=0
- (for /l %%i in (1,1,%max%) do (
- if defined num_%%i echo %%i
- ))>tmp%1%2↑.txt
-
- :format_str
- :: 检测相邻两行数值的差值是否为1,若为1,则是连续数;若不为1,则数值不连续
- set /p num=<tmp%1%2↑.txt
- set begin=
- for /f %%i in (tmp%1%2↑.txt) do (
- if %%i neq !num! (
- set /a diff=%%i-!num!
- call :judge_range %%i !num! !diff!
- )
- set num=%%i
- )
- if defined begin (
- set /p=[!begin!,%num%]}<nul
- ) else set /p=%num%}<nul
- echo,&echo %time%
- goto :eof
-
- :expand_num
- :: 把字符串格式化,然后按顺序展开
- set begin=&set end=
- (for /f "tokens=1*" %%i in ("%*") do (
- for %%x in (%%j) do (
- set str=%%x
- if "!str:~0,1!"=="[" (
- set num_begin=!str:~1!&set begin=yes
- )
- if "!str:~-1!"=="]" (
- set num_end=!str:~0,-1!&set end=yes
- )
- if not defined begin echo %%x
- if defined end (
- for /l %%y in (!num_begin!,1,!num_end!) do echo %%y
- set begin=&set end=
- )
- set max_%1=%%x
- )
- ))>%1.txt
- goto :eof
-
- :judge_range
- :: 判断数值范围的临界值,根据临界值输出格式化字符串
- if %3 equ 1 (
- if not defined begin set begin=%2
- ) else (
- if defined begin (
- set /p=[!begin!,%2],<nul
- set begin=
- ) else (
- set /p=%2,<nul
- )
- )
- goto :eof
复制代码 由于有大量的 set /a 操作,速度比较慢,当数据量增大时尤其明显,暂时只把功能完成,尚未优化。 |