Board logo

标题: [数值计算] 批处理函数:大数字加减乘除、时期时间计算、数字排序、进制转换等 [打印本页]

作者: 随风    时间: 2009-2-16 19:44     标题: 批处理函数:大数字加减乘除、时期时间计算、数字排序、进制转换等

本帖最后由 pcl_test 于 2017-1-22 19:38 编辑

发几个我的函数
2009-02-20 日更新:修正加法函数中一处bug,
                   增加整数除法“函数”(内勘多个标签,应该不算标准的封装)
2009-02-18 日更新:
  更新乘法函数,大大缩短代码,并且效率大大提升,且不再受位数限制。
  理论上只要积不超过变量赋值的最大位数就可以。
更新加法函数:代码略增,效率略为提高,且不再受位数限制。
更新减法函数:代码略增,效率提高,位数由200提升到1000位。
一、加法函数 任意位数 的正整数 进行 加法计算
二、减法函数 可以对 200位 以内正整数 进行 减法计算
三、乘法函数 可以对 任意位数 的正整数进行 乘法计算
四、计算批处理运行时间函数 时间必须是24小时制,未考虑时间为00点的情况。
五、查询指定天数前的日期(作者:Will Sort  出自:cn-dos )
六、数字排序函数
七、关于进制转换的函数
    1、任意进制互转(只能处理cmd范围内的数)
       标签段以封装,可直接调用,使用方法见标签上方的说明
       为方便使用,标签以外的代码作了界面美化等处理。使得代码略显臃肿。。。
    2、二进制转十六进制(封装)(通过4位一段转换,可处理超大数)
    3、十六进制转二进制(封装)(通过4位一段转换,可处理超大数)
    4、二进制转十进制(封装)(只能处理cmd范围内的数,小巧方便代码中调用)
    5、获取10进制数(含负数)的 原码、反码、补码(未封装)(只能处理cmd范围内的值)
       完全不懂计算机,只理解为计算机中负数用补码表达
       代码中二进制数用32位显示,超出32位的会出错,
       呵呵,不知道电脑中有没有用32位以上表达的二进制数,哈哈外行话见笑了^_^
    6、综合以上对2、8、10、16进制数进行转换、(未封装)
       显示转换后的2、8、10、16进制数及 原码、反码、补码

:
  1. @echo off
  2. call :jia 354687654165435 35486456 ok
  3. echo %ok%
  4. pause
  5. :jia 加法函数(封装)by @随风 @bbs.bathome.net
  6. ::计算任意位数的正整数加法
  7. setlocal enabledelayedexpansion&set f=&set "t="
  8. set var1=%~1&set var2=%~2&set /a j=0,n1=0,n2=0
  9. for /l %%a in (0 1 9) do (set vard1=&set "vard2="
  10. set var1=!var1:%%a= %%a !&set var2=!var2:%%a= %%a !)
  11. for %%a in (!var1!)do (set/a n1+=1&set vard1=%%a !vard1!)
  12. for %%a in (!var2!)do (set/a n2+=1&set vard2=%%a !vard2!)
  13. (if !n1! lss !n2! (set var1=%var2%&set "var2=%var1%"
  14. set vard1=%vard2%&set vard2=%vard1%))&set "var2=!var2: =!"
  15. for %%a in (!vard1!) do (if "!var2!"=="" set /a var2=0
  16. set /a a=%%a+!var2:~-1!+j&set t=!a:~-1!!t!&set "a=0!a!"
  17. set "j=!a:~-2,1!"&set var2=!var2:~0,-1!)
  18. if !j! neq 0 set "t=!j!!t!"
  19. Endlocal&set %~3=%t%&goto :EOF
复制代码
=====================================================================
:
  1. @echo off
  2. call :jian 354687654165435 35486456 ok
  3. echo %ok%
  4. pause
  5. :jian 减法函数(封装)by @随风 @bbs.bathome.net
  6. ::计算1000位以内的正整数减法
  7. setlocal enabledelayedexpansion&&set t=&set f=&set "lin="
  8. for /l %%a in (1 1 10) do set "lin=0000000000!lin!"
  9. set lin=!lin!!lin!!lin!!lin!!lin!&set "lin=!lin!!lin!"
  10. set var1=!lin!%~1&set var2=!lin!%~2&set vard1=&set/a j=0
  11. set var1=!var1:~-1000!&set "var2=!var2:~-1000!"
  12. if "!var1!" lss "!var2!" (set var1=%~2&set "var2=%~1"
  13. set "f=-") else set var1=%~1&set "var2=%~2"
  14. for /l %%a in (0 1 9) do set "var1=!var1:%%a= %%a !"
  15. for %%a in (!var1!) do set "vard1=%%a !vard1!"
  16. for %%a in (!vard1!) do (if "!var2!"=="" set/a var2=0
  17. set /a a=%%a-j,b=!var2:~-1!
  18. if !a! lss !b! (set /a a+=10,j=1)else set /a j=0
  19. set /a w=a-b&set t=!w!!t!&set var2=!var2:~0,-1!)
  20. for /f "tokens=* delims=0" %%a in ("!t!") do (
  21. if "%%a"=="" (set t=0) else set "t=%%a")
  22. Endlocal&set %~3=%f%%t%&goto :EOF
复制代码
=====================================================================
:
  1. @echo off
  2. call :cen 354687654165435 35486456 ok
  3. echo %ok%
  4. pause
  5. :cen 乘法函数(封装)by @随风 @bbs.bathome.net
  6. ::计算任意位数的正整数乘法
  7. setlocal enabledelayedexpansion
  8. if "%~1"=="0" Endlocal&set %~3=0&goto :EOF
  9. if "%~2"=="0" Endlocal&set %~3=0&goto :EOF
  10. set f=&set jia=&set ji=&set /a n1=0,n2=0
  11. set vard1=&set "vard2="&set var1=%~1&set "var2=%~2"
  12. for /l %%a in (0 1 9) do (
  13. set var1=!var1:%%a= %%a !&set var2=!var2:%%a= %%a !)
  14. for %%a in (!var1!)do (set /a n1+=1&set vard1=%%a !vard1!)
  15. for %%a in (!var2!)do (set /a n2+=1&set vard2=%%a !vard2!)
  16. if !n1! gtr !n2! (set vard1=%vard2%&set vard2=%vard1%)
  17. for %%a in (!vard1!) do (set "t="&set /a j=0
  18. for %%b in (!vard2!) do (if "!jia!"=="" set /a jia=0
  19. set /a a=%%a*%%b+j+!jia:~-1!&set "t=!a:~-1!!t!"
  20. set a=0!a!&set "j=!a:~-2,1!"&set jia=!jia:~0,-1!)
  21. set "ji=!t:~-1!!ji!"
  22. if "!j:~0,1!"=="0" (set ss=) else set "ss=!j:~0,1!"
  23. set jia=!ss!!t:~0,-1!)
  24. if not "!j:~0,1!"=="0" set "t=!j:~0,1!!t!"
  25. set "ji=!t!!ji:~1!"
  26. Endlocal&set %~3=%ji%&goto :EOF
复制代码
=====================================================================
  1. @echo off
  2. set suru=000012/001200
  3. call :cu0  %suru:/= % ok
  4. echo. %ok%
  5. pause
  6. exit
  7. :cu0 500位内整数除法函数(封装)by @随风 bbs.bathome.net
  8. ::函数内有 cu1 cu2 cu3 cu4 四个标签,引用时需注意
  9. setlocal enabledelayedexpansion&set "lin=00000"
  10. set /a zongw=1000,cs1w=0,cs2w=0,falg=0,x=0
  11. if "!str!"=="1" Endlocal&set %~3=%ff%!num!&goto :EOF
  12. if "%~1"=="0" set sang=0&goto cu4
  13. if "!str!"=="0" set sang=以零为除数的错误。&goto cu4
  14. if not defined xiaosu set /a xiaosu=10
  15. for /l %%a in (1 1 5) do set "lin=!lin!!lin!!lin!"
  16. set sang=&set ppp=&set var1=%~1&set "var2=%~2"
  17. for /f "tokens=* delims=0" %%a in ("!var1!")do set var1=%%a
  18. for /f "tokens=* delims=0" %%a in ("!var2!")do set var2=%%a
  19. for /l %%a in (0 1 9)do (set "var1=!var1:%%a= %%a !"
  20. set "var2=!var2:%%a= %%a !")
  21. for %%a in (!var1!) do set /a cs1w+=1
  22. for %%a in (!var2!) do set /a cs2w+=1
  23. for /l %%a in (1 1 10) do (set t=&set cs=%~2&set/a j=0
  24. for /l %%b in (1 1 !cs2w!) do (set /a a=%%a*!cs:~-1!+j
  25. set t=!a:~-1!!t!&set a=0!a!&set "j=!a:~-2,1!"
  26. set cs=!cs:~0,-1!&set cs%%a=&set "bj%%a=")
  27. if !j! neq 0 (set cs%%a=!lin!!j!!t!&set "bj%%a=!j!!t!"
  28. ) else set cs%%a=!lin!!t!&set "bj%%a=!t!"
  29. set "cs%%a=!cs%%a:~-%zongw%!")
  30. set var2=!lin!!var2: =!&set "var2=!var2:~-%zongw%!"
  31. set /a cswc=cs1w-cs2w&set "var1=!var1: =!"
  32. if !cswc! lss 0 (set cswc=!cswc:-=!&set/a flag=1
  33. for /l %%a in (1 1 !cswc!)do (
  34. if %%a leq 11 set sang=0!sang!&set /a x=cswc-1
  35. set "var1=!var1!0")
  36. set "sang=!sang:~0,1!.!sang:~1!")
  37. set ppp=!var1:~0,%cs2w%!&set "var1=!var1:~%cs2w%!"
  38. if !flag! equ 1 (set /a bul=1) else set /a bul=0
  39. goto cu2
  40. :cu1
  41. if not defined var1 (set "var1=0"
  42. if not defined ppp goto cu4
  43. if !flag! equ 0 (set sang=!sang!.&set /a flag=1))
  44. set/a bul=1&set ppp=!ppp!!var1:~0,1!&set "var1=!var1:~1!"
  45. :cu2
  46. if !x! geq %xiaosu% goto cu4
  47. set pvar1=!lin!!ppp!&set "pvar1=!pvar1:~-%zongw%!"
  48. if "!pvar1!" lss "!var2!" (
  49. if !bul! equ 1 (set sang=!sang!0&set /a bul=0
  50. if !flag! equ 1 set /a x+=1)
  51. if "!ppp:~0,1!"=="0" set "ppp="
  52. goto cu1)
  53. if !flag! equ 1 set /a x+=1
  54. set /a bul=0
  55. ::计算商
  56. for /l %%a in (1 1 10) do (
  57. if "!cs%%a!" equ "!pvar1!" (
  58. set "sang=!sang!%%a"&set "yu=!bj%%a!"&goto cu3)
  59. if "!cs%%a!" gtr "!pvar1!" (set /a s=%%a-1
  60. set "sang=!sang!!s!"&set yu=!t!&goto cu3)
  61. set "t=!bj%%a!")
  62. :cu3 计算差
  63. set cjs=!ppp!&set cj1=&set m=&set/a jjj=0
  64. for /l %%a in (0 1 9) do set "cjs=!cjs:%%a= %%a !"
  65. for %%a in (!cjs!) do set "cj1=%%a !cj1!"
  66. for %%a in (!cj1!) do (if "!yu!"=="" set/a yu=0
  67. set /a a=%%a-jjj,b=!yu:~-1!
  68. if !a! lss !b! (set /a a+=10,jjj=1)else set/a jjj=0
  69. set /a w=a-b&set m=!w!!m!&set yu=!yu:~0,-1!)
  70. for /f "tokens=* delims=0" %%m in ("!m!") do (
  71. if "%%m"=="" (set m=0) else set "m=%%m")
  72. if !m! equ 0 (
  73. if "!var1:0=!"=="" set sang=!sang!!var1!&goto cu4
  74. set ppp=&goto cu1) else set "ppp=!m!"
  75. goto cu2
  76. :cu4
  77. if "!sang:~0,1!"=="." set "sang=0!sang!"
  78. Endlocal&set %~3=%ff%%sang%&goto :EOF
复制代码
==========================================================================
  1. @echo off
  2. set t=%time%
  3. call :time0 "%t%" "%time%" ok
  4. echo %ok%
  5. pause
  6. :time0  计算时间差 (封装)
  7. @echo off&setlocal&set /a n=0&rem code 随风 @bbs.bathome.net
  8. for /f "tokens=1-8 delims=.: " %%a in ("%~1:%~2") do (
  9. set /a n+=10%%a%%100*360000+10%%b%%100*6000+10%%c%%100*100+10%%d%%100
  10. set /a n-=10%%e%%100*360000+10%%f%%100*6000+10%%g%%100*100+10%%h%%100)
  11. set /a s=n/360000,n=n%%360000,f=n/6000,n=n%%6000,m=n/100,n=n%%100
  12. set "ok=%s% 小时 %f% 分钟 %m% 秒 %n% 毫秒"
  13. endlocal&set %~3=%ok:-=%&goto :EOF
复制代码
=====================================================================
数字排序
:
  1. @echo off
  2. :start
  3. setlocal enabledelayedexpansion&cls
  4. for /l %%a in (1 1 10) do set str=!str! !random!
  5. echo.&echo %str%
  6. call :sort "%str%" ok
  7. echo  %ok%
  8. pause>nul
  9. endlocal&goto start
  10. :sort 可以处理0开头的数、重复数及200位以内的超大整数(封装)
  11. @echo off&setlocal enabledelayedexpansion
  12. for /f "delims==" %%a in ('set p. 2^>nul')do set "%%a="
  13. for /l %%a in (1 1 20) do set "p.lin=0000000000!p.lin!"
  14. for %%a in (%~1) do (set s=!p.lin!%%a&set "s=!s:~-200!"
  15. if defined p...!s! (set p..%%a=!p..%%a! %%a
  16. set p...!s!=!p..%%a! %%a) else (set p...!s!=%%a))
  17. for /f "tokens=2 delims==" %%a in ('set p...') do (
  18. for %%i in (%%a) do set "p.ok=!p.ok! %%i")
  19. endlocal&set %~2=%p.ok:~1%&goto :EOF
复制代码
=====================================================================
:
  1. @echo off
  2. :start
  3. setlocal&cls
  4. set /p tian=      请指定要追溯的天数:&echo\
  5. call :Date2Day "%date%" %tian% ok
  6. echo       %ok%
  7. endlocal&pause>nul&goto start
  8. :Date2Day 计算指定天数 前/后 的日期及星期 (封装)
  9. @echo off&setlocal ENABLEEXTENSIONS
  10. for /f "tokens=1-3 delims=/-:\, " %%a in ('echo/%~1') do (
  11. set /a yy=%%a,mm=100%%b%%100,dd=100%%c%%100)
  12. set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
  13. set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
  14. set /a i=j-%~2,a=i+2472632,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a
  15. set /a d=4*c+3,d/=1461,e=-1461*d,e/=4,e+=c,m=5*e+2,m/=153,dd=153*m+2,dd/=5
  16. set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d-4800+m/10
  17. (if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)
  18. for %%a in (一/1 二/2 三/3 四/4 五/5 六/6 日/0) do (
  19. for /f "tokens=1,2 delims=/" %%i in ("%%a")do set %%i=%%j&set ".%%j=%%i")
  20. if %~2 gtr 0 (set /a d=^(7-%~2%%7+%date:~-1%^)%%7&set x=前) else (
  21. set /a d=^(~%~2+1+%date:~-1%^)%%7&set x=后)
  22. call set "d=星期%%.%d%%%"
  23. endlocal&set %~3=%yy%-%mm%-%dd% %d%&goto :EOF
复制代码
=====================================================================
进制转换(函数)
代码1、
   任意进制互转
  1. @echo off&color 1f&set /a q=10,h=2
  2. title 任意进制互转 默认:%q%进制转%h%进制
  3. :start
  4. setlocal&echo.&echo. 被转换的数 被转换数的进制 需转换成的进制
  5. echo.&echo. 如:95 16 10  表示将 16进制数95 转换 为10进制数
  6. echo.&echo. 参数可用分割符为  空格 / + - \  如:95/16/10 或95+16+10
  7. echo.&echo. 默认将 10进制 转换为 2进制(即上例中如果不输入 16 10 则默认为 10 2)
  8. echo.&set /p num= 请输入需转换的数 &cls
  9. if not defined num endlocal&goto start
  10. for /f "tokens=1-3 delims=/+-\ " %%a in ("%num%") do (
  11.     set "num=%%a"
  12.     if not "%%b"=="" if not "%%c"=="" set /a q=%%b,h=%%c
  13. )
  14. call :nxn "%num%" ok %q% %h%
  15. for /l %%a in (1 1 12)do (
  16.    if %%a equ 4 (
  17.       echo. %q%进制转%h%进制 结果
  18.       echo.&echo. %num% = %ok%
  19.     )else echo\
  20. )
  21. set /a w=%random%%%2
  22. if %w% equ 1 (set f=1f) else (set f=df)
  23. color %f%&endlocal&goto start
  24. ::函数使用方法:call :nxn "98" ok 10 2
  25. ::call :nxn "被转换的数" 保存结果的变量名 被转换数的进制 需转换成的进制
  26. ::默认将 10进制 转换为 2进制(即上例中不输入 10 2)
  27. :nXn 任意进制互转 @随风 @bbs.bathome.net(封装)
  28. @echo off&setlocal enabledelayedexpansion
  29. if "%~4"=="" (set /a q=10,h=2)else (set /a q=%~3,h=%~4)
  30. set "str=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  31. for /l %%a in (0 1 35)do set .%%a=!str:~%%a,1!&set ".!str:~%%a,1!=%%a"
  32. set sun=&set jie=&set "var=%~1"&set /a nnn=1,num=0
  33. for /l %%a in (0 1 100) do (
  34. if not "!var:~%%a,1!"=="" (call set sun=%%.!var:~%%a,1!%% !sun!))
  35. for %%a in (!sun!) do set /a num=%%a*nnn+num,nnn*=q
  36. :10进制转n进制
  37. set /a yu=num%%h,num/=h
  38. set "jie=!.%yu%!!jie!"&if !num! gtr 0 goto 10进制转n进制
  39. endlocal&set %~2=%jie%&goto :EOF
复制代码
代码2、
   二进制转十六进制(封装)(通过4位一段转换,可处理超大数)
  1. @echo off&color 1f&title 二进制 转 十六进制
  2. call :2x16 "11111111 11111111 11111111 11111110" ok
  3. echo %ok%
  4. pause
  5. ::以4位一段,分别转换为十六进制,不必考虑超大数问题
  6. :2x16 二进制 转 十六进制  @随风 @bbs.bathome.net (封装)
  7. @echo off&setlocal enabledelayedexpansion
  8. set "str=0123456789ABCDEF"
  9. set k=&set kk=&set xx=&set "x=000%~1"
  10. set x=!x:0= 0!&set x=!x:1= 1!&set /a jj=0,ss=1
  11. for %%a in (!x!) do set "xx=%%a !xx!"
  12. for %%a in (!xx!) do (set /a jj+=%%a*ss,ss=ss*2
  13. if !ss! equ 16 set k=!jj! !k!&set /a jj=0,ss=1)
  14. for %%a in (!k!) do set kk=!kk!!str:~%%a,1!
  15. endlocal&set %~2=%kk%&goto :EOF
复制代码
代码3、
   十六进制转二进制(封装)(通过4位一段转换,可处理超大数)
  1. @echo off&color 1f&title 十六进制 转 二进制
  2. set mmm=bfa35e7d8
  3. call :16x2 %mmm% ok
  4. echo.&echo  十六进制 %mmm%
  5. echo.&echo    二进制 %ok%
  6. echo.&pause
  7. ::以4位一段,分别转换为二进制,不必考虑超大数问题
  8. :16x2 十六进制 转 二进制  @随风 @bbs.bathome.net (封装)
  9. @echo off&setlocal enabledelayedexpansion
  10. set str=0123456789abcdef&set ok=&set "num=%~1"
  11. for /l %%a in (0 1 15) do (set ".!str:~%%a,1!=%%a"
  12. call set "num=%%num:!str:~%%a,1!= !str:~%%a,1!%%")
  13. for %%i in (!num!) do (set /a x=0,n=!.%%i!
  14. for %%a in (8 4 2 1) do (set /a x+=%%a
  15. if !n! geq !x! (set ok=!ok!1) else (
  16. set ok=!ok!0&set /a x-=%%a)))
  17. endlocal&set %~2=%ok%&goto :EOF
复制代码
代码4、
   二进制转十进制(封装)(只能处理cmd范围内的数,小巧方便代码中调用)
  1. @echo off
  2. call :2x10 01100100 ok
  3. echo %ok%
  4. pause
  5. :2x10  2进制转 10进制 @随风 @bbs.bathome.net (封装)
  6. @echo off&setlocal enabledelayedexpansion
  7. set /a nnn=1,num=0&set nn=&set "n=%~1"
  8. set "n=!n:0= 0!"&set "n=!n:1= 1!"
  9. for %%a in (!n!) do set "nn=%%a !nn!"
  10. for %%a in (!nn!) do set /a num+=%%a*nnn,nnn*=2
  11. endlocal&set %~2=%num%&goto :EOF
复制代码
代码5、
   获取10进制数(含负数)的 原码、反码、补码(未封装)
  1. @echo off&color 1f&title 获取10进制数的 原码、反码、补码
  2. ::获取10进制数的 原码、反码、补码
  3. ::计算机中 负数用补码表达
  4. ::补码:反码+1
  5. ::反码:将二进制数(原码)按位取反 (即:1变0、0变1)
  6. ::原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。
  7. ::个人理解为在计算机中表达负数的二进制数叫补码
  8. ::所以以下代码中,若输入的是负数则结果中补码代表该数
  9. @echo off&rem @随风 @bbs.bathome.net @2009-01-15
  10. :start
  11. setlocal enabledelayedexpansion
  12. for /l %%a in (1 1 15) do set "lin=00000!lin!"
  13. echo.&echo.&set /p y10= 请输入一个10进制数可以为负数 &cls
  14. if !y10! lss 0 (set /a n="~y10"+1,c=1) else set /a n=y10,c=1
  15. :10x2 将10进制转成2进制 原码
  16. set /a y=n%%2,n/=2&set "j=!y!!j!"&if !n! gtr 0 goto 10x2
  17. set j=!lin!!j!&set "j=!j:~-32!"
  18. set ss=!j:0= 0!&set "ss=!ss:1= 1!"
  19. :: 获取反码
  20. for %%a in (%ss%) do set /a n="^!%%a"&set "f=!f!!n!"
  21. set f=!lin!!f!&set f=!f:~-32!&set "ss=!f!"
  22. :buma 获取补码
  23. set /a m=!ss:~-1!+c
  24. if !m! gtr 1 (set c=1&set b=0!b!)else set c=0&set "b=!m!!b!"
  25. set "ss=!ss:~0,-1!"
  26. if defined ss goto buma
  27. echo.
  28. echo  10进制数  %y10%&echo.
  29. echo      原码  %j:~-32,8% %j:~-24,8% %j:~-16,8% %j:~-8%
  30. echo      反码  %f:~-32,8% %f:~-24,8% %f:~-16,8% %f:~-8%
  31. echo      补码  %b:~-32,8% %b:~-24,8% %b:~-16,8% %b:~-8%
  32. endlocal&goto start
复制代码
代码6、转换 2、8、10、16、进制数并显示2进制 原码、反码、补码(未封装)
  1. @echo off
  2. ::转换 2、8、10、16、进制数并显示2进制 原码、反码、补码
  3. ::计算机中 负数用补码表达
  4. ::补码:反码+1
  5. ::反码:将二进制数(原码)按位取反 (即:1变0、0变1)
  6. ::原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。
  7. ::个人理解为在计算机中表达负数的二进制数叫补码
  8. ::完全不懂计算机,只理解为计算机中负数用补码表达
  9. ::代码中二进制数用32位显示,超出32位的会出错
  10. ::只能处理cmd范围内的数
  11. @echo off&title 转换 2、8、10、16、进制数并显示2进制 原码、反码、补码
  12. ::@随风 @bbs.bathome.net @2009-1-12
  13. set "str=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  14. set "color1=1f&set color2=df"&color 1f
  15. for /l %%a in (0 1 35) do (
  16.    call set ".%%a=%%str:~%%a,1%%"
  17.    call set ".%%str:~%%a,1%%=%%a"
  18. )
  19. :start
  20. setlocal enabledelayedexpansion&color %color1%
  21. echo.
  22. echo. ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
  23. echo. ┃                                                          ┃
  24. echo. ┃输入格式:需转换的数+该数的进制(可用分割符 / \ + - 空格)┃
  25. echo. ┃                                                          ┃
  26. echo. ┃默认输入的为10进制数、也可以是2、8、16进制、但必须指明进制┃
  27. echo. ┃                                                          ┃
  28. echo. ┃如:需转换16进制 2afd 则输入 2afd+16  10进制数则不需要指明┃
  29. echo. ┃                                                          ┃
  30. echo. ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
  31. echo.&set /p num= 请输入需转换的数  &cls
  32. if not defined num endlocal&goto start
  33. for /f "tokens=1,2 delims=/\+- " %%a in ("%num%") do (
  34.    set "n0=%%a"
  35.    if "%%b"=="" (set jz=10) else set /a jz=%%b
  36. )
  37. echo.&echo    被转换的数为: !jz!进制数  !n0!&echo.
  38. if !jz! equ 16 (set /a n10=0x!n0!) else (
  39.    if !jz! equ 10 (set n10=!n0!) else (
  40.       if !jz! equ 8 (set /a n10=0!n0!) else (
  41.          set /a nnn=1,n10=0&call :2x10 !n0!
  42. )))
  43. for %%a in (16 10 8 2) do call :10进制转n进制 !n10! %%a
  44. echo.&call :yuan&echo.
  45. endlocal&set color1=%color2%&set "color2=%color1%"
  46. goto start
  47. :10进制转n进制
  48. set /a yu=n10%%%~2,n10/=%~2
  49. set "jie=!.%yu%!!jie!"&if !n10! gtr 0 goto 10进制转n进制
  50. set "xs=         %~2"
  51. echo !xs:~-5! 进制  !jie!
  52. set d2=!jie!&set jie=&set "n10=%~1"
  53. goto :EOF
  54. :2x10  2进制转10进制
  55. set /a n10+=!n0:~-1!*nnn,nnn*=2
  56. set "n0=!n0:~0,-1!"
  57. if defined n0 goto 2x10
  58. goto :EOF
  59. :yuan
  60. for /l %%a in (1 1 15) do set lin=00000!lin!
  61. set j=!lin!!d2!&set "j=!j:~-32!"
  62. set ss=!j:0= 0!&set "ss=!ss:1= 1!"
  63. :: 获取反码
  64. for %%a in (%ss%) do set /a n="^!%%a"&set "f=!f!!n!"
  65. set f=!lin!!f!&set f=!f:~-32!&set "ss=!f!"
  66. set /a c=1
  67. :buma 获取补码
  68. set /a m=!ss:~-1!+c
  69. if !m! gtr 1 (set c=1&set b=0!b!)else set c=0&set "b=!m!!b!"
  70. set "ss=!ss:~0,-1!"
  71. if defined ss goto buma
  72. echo       原码  %j:~-32,8% %j:~-24,8% %j:~-16,8% %j:~-8%
  73. echo       反码  %f:~-32,8% %f:~-24,8% %f:~-16,8% %f:~-8%
  74. echo       补码  %b:~-32,8% %b:~-24,8% %b:~-16,8% %b:~-8%
  75. goto :EOF
复制代码
[ 本帖最后由 随风 于 2009-2-21 19:00 编辑 ]
作者: aabb    时间: 2009-2-16 20:28

牛人啊!!这个我一个都看不懂!!!!
看来学习还得要很长时间才能掌握
作者: wxcute    时间: 2009-2-16 21:22

真是一声惊雷阿。

我还从来没有写过封装的“函数”,是时候要整理下了。
作者: zjw767676    时间: 2009-2-16 23:39

什么是封装?怎么使用?第一个代码运行后的结果如下:

能解释下该函数怎么使用吗?
作者: 随风    时间: 2009-2-19 14:59

所谓封装,意识是该代码可以放在任何一个其它的批处理代码中运行,而不影响该批处理中的原代码。
调用方式就是 call 标签 参数
你的这个结果就是一楼 call 后面两个数的和。
作者: lockmove    时间: 2009-2-22 21:54

我也想弄懂函数,但找不到相关的帖子.call 了之后怎么传值? 就如第一个,jia  %~1代表354687654165435 %~2代表35486456?就这样么?  ok就是%~3?改变了%~3  ok的值也变了?没其他注意事项了吗?
作者: lockmove    时间: 2009-2-22 22:00

5、获取10进制数(含负数)的 原码、反码、补码(未封装)(只能处理cmd范围内的值)
       完全不懂计算机,只理解为计算机中负数用补码表达
       代码中二进制数用32位显示,超出32位的会出错,
       呵呵,不知道电脑中有没有用32位以上表达的二进制数,哈哈外行话见笑了^_^

我可以解释下,计算机里都用补码表示,正数补码不变,即原码(正数的反码也不变.),负数补码为原码 取反加1.
举例5的话,假设8位.就是原码 补码都是 00000101.
-5 的反码 11111010 然后加1就是补码 11111011;大致就这样.
靠你计算的话,肯定没错, 就是概念弄错了而已.

32位就是4个Byte,int类型.如果你用long int的话 就不只32位了.
我猜bat只支持4个字节来表示数字,所以就32位了.
看来超版你不是计算机专业的啊,水平这么高,让我汗颜.

[ 本帖最后由 lockmove 于 2009-2-22 22:07 编辑 ]
作者: netbenton    时间: 2009-10-9 22:17

我贴一个较高效的浮点加法函数
  1. @echo off
  2. set aa=%time%
  3. for /l %%a in (1,1,1000) do call :_ADD 123456722222222222222890.3212222222222222222222222 1222222222222222222.789233333333333333333333333
  4. set/p =计算1000次,用时:<NUL&CALL
  5. goto :eof
  6. ::前面为演示用
  7. :::::::::::::::::::::::::::::::::::::
  8. ::浮点加法 call _ADD  <被加数> <加数> [返回变量]
  9. :_ADD [var]   //made by netbenton on 2009.10.09
  10. ::
  11. ::分别支持十进制的64位整数和小数,一次计算仅用0.01秒
  12. :::::::::::::::::::::::::::::::::::::
  13. (setlocal enabledelayedexpansion
  14. set L=&for /l %%a in (1,1,8) do set L=!L!00000000
  15. for /f "tokens=1-3 delims=." %%a in ("!L!%1.!L!") do set at=%%a&set aw=%%b%%c
  16. for /f "tokens=1-3 delims=." %%a in ("!L!%2.!L!") do set bt=%%a&set bw=%%b%%c
  17. set a=!at:~-64!!aw:~,64!
  18. set b=!bt:~-64!!bw:~,64!
  19. set e=
  20. set v=200000000
  21. for /l %%a in (8,8,128)do set/a v=1!b:~-%%a,8!+1!a:~-%%a,8!+!v:~-9,-8!-2&set e=!v:~-8!!e!
  22. set e=!e:0= !
  23. for /f "tokens=*" %%a in ("!e:~,-64!.!e:~64!") do set e=%%~nxa
  24. for %%a in ("!e: =0!") do endlocal&(if %3.==. (echo %%~a) else set %3=%%~a)
  25. exit/b)
  26. ::计算时差函数
  27. :etime [return]  // By plp626 On 09-7-20
  28. setlocal enabledelayedexpansion&set be=%~1;%~2&set be=!be::=;1!&set n=
  29. for %%a in (%be:.=%)do set/a n+=1&set t!n!=%%a
  30. set/a n=((t4-t1)*60+t5-t2)*6000+t6-t3,s=n/100,w=n%%100/10,f=n%%100%%10
  31. endlocal&(if %3.==. (echo %s%.%w%%f%) else set %3=%n:-=%)&exit/b
复制代码

[ 本帖最后由 netbenton 于 2009-10-10 07:58 编辑 ]
作者: plp626    时间: 2009-10-10 13:06

原帖由 netbenton 于 2009-10-9 22:17 发表
我贴一个较高效的浮点加法函数@echo off

set aa=%time%
for /l %%a in (1,1,1000) do call :_ADD 123456722222222222222890.3212222222222222222222222 1222222222222222222.789233333333333333333333333

set ...



谢谢使用etime子过程,只是那个还是有bug的,对跨天情况考虑不全,现在代码已经更新,
http://bbs.bathome.net/thread-4701-1-1.html

如果兄对那个代码还抱有一点点喜欢,为防止bug到处蔓延还是建议兄下次使用更新代码
作者: shuaige100    时间: 2010-6-24 23:30

不明白为什么要那么复杂,应该要耗电脑很大内存很cpu的吧?我们又不是做计算火箭的事业,呵呵,能也写个简单的给我们吗?
作者: sgaizxt001    时间: 2010-6-25 01:05

10楼,我推荐你在win+r,然后输入calc

我很好奇这个批处理的原理是什么,变量的字节数超出存储范围后是怎么处理的。我测试看不出问题啊。郁闷

[ 本帖最后由 sgaizxt001 于 2010-6-25 02:34 编辑 ]
作者: ht河豚    时间: 2013-1-6 21:42

好贴,顶一下
作者: jatqwgij    时间: 2015-1-28 21:28

高人啊。。。。。。。。。。。。
作者: happy886rr    时间: 2016-3-17 20:21

本帖最后由 happy886rr 于 2016-4-5 14:59 编辑

回复 1# 随风
我也写了个批处理大数浮点乘法,任意位,任意小数乘法均可以计算。
全精度浮点乘,批处理的各种特殊性全部考虑,计算效率极佳。
只受限于批处理的输入,批处理最多允许输入一千多位。但是,程序可以扩展。稍加改造即可用多个字符串来存储输入。这样理论上是无限制的。当然最大限制是6300位大数,源于批处理的2的31次方限制。
  1. @echo off&mode con cols=58 lines=38
  2. :MAIN
  3. cls
  4. echo 浮点乘表达式^(乘号用*表示^)
  5. set /p Express=-^>
  6. setlocal enabledelayedexpansion
  7. REM 浮点计数
  8. for /f "tokens=1,2 delims=*" %%a in ("!Express!") do (
  9. set A=%%a&set A=!A: =!
  10. set B=%%b&set B=!B: =!
  11. )
  12. for /f "tokens=1,2 delims=." %%a in ("!A!") do (
  13. set A1=%%a&set A=!A1!%%b
  14. if "%%b"=="" (set PA=0) else (
  15. set A2=%%b
  16. for %%i in (512 256 128 64 32 16 8 4 2 1) do (
  17.     if not "!A2:~%%i!"=="" (
  18. set/a PA+=%%i
  19. set "A2=!A2:~%%i!"
  20. )
  21. )
  22. if "!A2:~1!"=="" (set/a PA+=1)
  23. )
  24. )
  25. for /f "tokens=1,2 delims=." %%a in ("!B!") do (
  26. set B1=%%a&set B=!B1!%%b
  27. if "%%b"=="" (set PB=0) else (
  28. set B2=%%b
  29. for %%i in (512 256 128 64 32 16 8 4 2 1) do (
  30.     if not "!B2:~%%i!"=="" (
  31. set/a PB+=%%i
  32. set "B2=!B2:~%%i!"
  33. )
  34. )
  35. if "!B2:~1!"=="" (set/a PB+=1)
  36. )
  37. )
  38. set/a PO=PA+PB
  39. REM 位数信息
  40. CALL :CUT !A! A NA
  41. CALL :CUT !B! B NB
  42. set/a N=NA+NB,NA*=3,NB*=3
  43. echo ======================================
  44. echo 被乘数信息:  有效!NA!位,浮点!PA!位  
  45. echo   乘数信息:  有效!NB!位,浮点!PB!位
  46. echo ======================================
  47. set t1=!time:~-5!
  48. REM 核心乘法
  49. for /l %%i in (1 1 !N!) do (
  50. for /l %%j in (1 1 %%i) do (
  51. set/a j=%%i-%%j+1
  52. if defined A[%%j] (
  53. if defined B[!j!] (
  54. set/a sum=A[%%j]*B[!j!]+sum
  55. )
  56. )
  57. )
  58. set/a s=sum+1000
  59. set sum=!sum:~0,-3!
  60. set pul=!s:~-3!!pul!
  61. )
  62. :DIS 显示结果
  63. if !PO! equ 0 (
  64. for /l %%i in (1 1 5) do (
  65. if "!pul:~0,1!"=="0" (
  66. set pul=!pul:~1!
  67. )
  68. )
  69. echo =!pul!
  70. ) else (
  71. set pre=!pul:~0,-%PO%!
  72. for /l %%i in (1 1 5) do (
  73. if "!pre:~0,1!"=="0" (
  74. set pre=!pre:~1!
  75. )
  76. )
  77. if not defined pre (set pre=0)
  78. echo =!pre!.!pul:~-%PO%!
  79. )
  80. REM 毫秒计时器
  81. set "t2=!time:~-5!" &set/a "t=1!t2:.=!-1!t1:.=!" &if !t! lss 0 (set/a t+=6000)
  82. set/p=耗时!t:~0,-2!秒!t:~-2!0毫秒
  83. endlocal&goto MAIN
  84. :CUT 分割数组
  85. set num=%1
  86. if "!num:~-3!"=="!num:~-4!" (
  87. set %2[1]=!num!
  88. set %3=1
  89. goto :eof
  90. )
  91. for /l %%i in (1 1 365) do (
  92. if "!num:~0,-3!"=="" (
  93. set/a %2[%%i]=!num!
  94. set %3=%%i
  95. goto :eof
  96. )
  97. set/a %2[%%i]=1!num:~-3!-1000
  98. set num=!num:~0,-3%!
  99. )
复制代码
测试 615位大数   35486456354... 乘以 312位大数   35867...用时9秒。for循环的效率以及批处理脆弱的计算能力,导致它远远不及C语言(需要0.3秒).
----------------------------------------------------------------------------------------------------------------------------------------------------------------
下面是大整数加法,1000位加1000位范围内,再多,cmd窗口输不进去。效率基本0.0几秒吧。
  1. @echo off&setlocal enabledelayedexpansion
  2. title By Happy
  3. mode con cols=65 lines=35
  4. REM 大数长度
  5. set "MAX=1000" ^位
  6. REM 分割大小
  7. set "K=8"      ^位
  8. set /a CYC=MAX/K
  9. :MAIN
  10. cls
  11. echo 请输入^(被加数^)
  12. set /p A=-^>:
  13. echo 请输入^(加数^)
  14. set /p B=-^>:
  15. REM 优化字符
  16. setlocal
  17. CALL :POINT !A! A N1
  18. CALL :POINT !B! B N2
  19. set /a B1=N1*K
  20. set /a B2=N2*K
  21. echo ======================================
  22. echo 被加数信息:  预估!B1!位
  23. echo   加数信息:  预估!B2!位
  24. echo ======================================
  25. echo 计算结果
  26. REM 加法核心
  27. if !N1! gtr !N2! (set RM=!N1! &set dx=B) else (set RM=!N2! &set dx=A)
  28. for /l %%i in (1 1 !RM!) do (
  29. if not defined !dx![%%i] (set "!dx![%%i]=00000000")
  30. set /a sum=1!A[%%i]!+1!B[%%i]!+sum
  31. set S=!sum:~-%K%!!S!
  32. set /a sum=!sum:~0,1!-2
  33. )
  34. REM 显示
  35. :DISP
  36. for /l %%i in (1 1 8) do (if "!S:~0,1!"=="0" (set S=!S:~1!))
  37. if "!S!"=="" (set S=0)
  38. echo,!S!
  39. pause>nul
  40. endlocal
  41. goto MAIN
  42. REM 分割数位
  43. :POINT
  44. set num=%1
  45. for /l %%i in (1 1 !CYC!) do (
  46. set %2[%%i]=!num:~-%K%!
  47. set num=!num:~0,-%K%!
  48. if "!num!"=="" (
  49. set /a CU=!%2[%%i]!+100000000
  50. set %2[%%i]=!CU:~-%K%!
  51. set /a %3=%%i
  52. goto :eof
  53. )
  54. )
复制代码

作者: pcl_test    时间: 2017-1-22 19:49

本帖最后由 pcl_test 于 2019-4-7 22:59 编辑

批处理,两个不分正负的大数的加减运算
  1. @echo off
  2. for %%a in (
  3.     "1.1 - 0.9"
  4.     "1.12345678987654321 + -9.87654321012345679"
  5.     "6.6543212345678 - 5.5432101234567"
  6.     "-2 - 2.4948463537"
  7.     "-93701350643248383.03974234214254643221455737 - 364354503.67365700005267589864236576"
  8.     "-0.4253500 - -5762.4948463537"
  9.     "0 - 0"
  10.     "232.556 - 232.556"
  11.     "0 + 0"
  12.     "0 - 234.342250988"
  13.     "-3.4536 - 3456"
  14.     "325689088000004600 - 94872734352.487409900094848377236474830937"
  15.     "-34.435464573575735 + -3425.0298576283039836"
  16.     "4 - 1000000.0000001"
  17. ) do (
  18.     for /f "tokens=1-3" %%i in (%%a) do (
  19.         setlocal enabledelayedexpansion
  20.         rem 由于cmd自身的各种限制,不做过多考虑,暂支持两个长度在4000位以内不分正负的整数或小数的加减运算
  21.         rem 用法call :calc num1 [+/-] num2 result
  22.         call :calc %%i %%j %%k result
  23.         echo;%%~a
  24.         echo;= !result!
  25.         echo;
  26.         endlocal
  27.     )
  28. )
  29. pause&exit
  30. :calc
  31. rem 屏蔽数字合法性检测可提高效率
  32. echo;%~1|findstr "^-0\.0*[1-9][0-9]*$ ^0\.0*[1-9][0-9]*$ ^0$ ^-[1-9][0-9]*$ ^[1-9][0-9]*$ ^-[1-9][0-9]*\.[0-9][0-9]*$ ^[1-9][0-9]*\.[0-9][0-9]*$">nul||set n=1
  33. echo;%~3|findstr "^-0\.0*[1-9][0-9]*$ ^0\.0*[1-9][0-9]*$ ^0$ ^-[1-9][0-9]*$ ^[1-9][0-9]*$ ^-[1-9][0-9]*\.[0-9][0-9]*$ ^[1-9][0-9]*\.[0-9][0-9]*$">nul||set n=1
  34. if defined n (set "%~4=数字不合法"&goto :eof)
  35. if "%~2" neq "+" if "%~2" neq "-" (set "%~4=算术运算符不正确"&goto :eof)
  36. if "%~4" equ "" (set "%~4=缺少结果变量"&goto :eof)
  37. if "%~1" equ "0" (
  38.     if "%~3" equ "0" (set "%~4=0") else (
  39.         set a=%~3
  40.         if "%~2" equ "+" (
  41.             set "%~4=%~3"
  42.         ) else (
  43.             if "!a:~,1!" equ "-" (set "%~4=!a:~1!") else (set "%~4=-%~3")
  44.         )
  45.     )
  46.     goto :eof
  47. )
  48. if "%~3" equ "0" (set "%~4=%~1"&goto :eof)
  49. if "%~1" equ "%~3" if "%~2" equ "-" (set "%~4=0"&goto :eof)
  50. set a=%~1.0
  51. set b=%~3.0
  52. for /f "tokens=1,2 delims=." %%a in ("%a:-=%") do set "a_1=%%a"&set "a_2=%%b"
  53. for /f "tokens=1,2 delims=." %%a in ("%b:-=%") do set "b_1=%%a"&set "b_2=%%b"
  54. call :strlen %a_1% L1_1
  55. call :strlen %a_2% L1_2
  56. call :strlen %b_1% L2_1
  57. call :strlen %b_2% L2_2
  58. for %%i in (1 2) do (
  59.     set "zero="&set m=0
  60.     if !L1_%%i! leq !L2_%%i! (
  61.         set /a m=L2_%%i-L1_%%i
  62.         if !m! neq 0 (
  63.             for /l %%a in (1 1 !m!) do set zero=!zero!0
  64.         )
  65.         if "%%i" equ "1" (set a_%%i=!zero!!a_%%i!) else set a_%%i=!a_%%i!!zero!
  66.         set Len_%%i=!L2_%%i!
  67.     ) else (
  68.         set /a m=L1_%%i-L2_%%i
  69.         for /l %%a in (1 1 !m!) do set zero=!zero!0
  70.         if "%%i" equ "1" (set b_%%i=!zero!!b_%%i!) else set b_%%i=!b_%%i!!zero!
  71.         set Len_%%i=!L1_%%i!
  72.     )
  73. )
  74. set /a Len=Len_1+Len_2+1
  75. if "%~2" equ "+" (
  76.     if "!a:~,1!" neq "-" (
  77.         if "!b:~,1!" neq "-" (
  78.             call :jia %a_1%.%a_2% %b_1%.%b_2% %Len% s
  79.             set "%~4=!s!"
  80.         ) else (
  81.             call :jian %a_1%.%a_2% %b_1%.%b_2% %Len% s
  82.             if "%a_1%.%a_2%" gtr "%b_1%.%b_2%" (set "%~4=!s!") else set "%~4=-!s!"
  83.         )
  84.     ) else (
  85.         if "!b:~,1!" neq "-" (
  86.             call :jian %a_1%.%a_2% %b_1%.%b_2% %Len% s
  87.             if "%a_1%.%a_2%" gtr "%b_1%.%b_2%" (set "%~4=-!s!") else set "%~4=!s!"
  88.         ) else (
  89.             call :jia %a_1%.%a_2% %b_1%.%b_2% %Len% s
  90.             set "%~4=-!s!"
  91.         )
  92.     )
  93. ) else (
  94.     if "!a:~,1!" neq "-" (
  95.         if "!b:~,1!" neq "-" (
  96.             call :jian %a_1%.%a_2% %b_1%.%b_2% %Len% s
  97.             if "%a_1%.%a_2%" lss "%b_1%.%b_2%" (set "%~4=-!s!") else set "%~4=!s!"
  98.         ) else (
  99.             call :jia %a_1%.%a_2% %b_1%.%b_2% %Len% s
  100.             set "%~4=!s!"
  101.         )
  102.     ) else (
  103.         if "!b:~,1!" neq "-" (
  104.             call :jia %a_1%.%a_2% %b_1%.%b_2% %Len% s
  105.             set "%~4=-!s!"
  106.         ) else (
  107.             call :jian %a_1%.%a_2% %b_1%.%b_2% %Len% s
  108.             if "%a_1%.%a_2%" lss "%b_1%.%b_2%" (set "%~4=!s!") else set "%~4=-!s!"
  109.         )
  110.     )
  111. )
  112. goto :eof
  113. :strlen
  114. setlocal
  115. set "$=%1#"
  116. set len=&for %%a in (4000 2048 1024 512 256 128 64 32 16)do if !$:~%%a!. neq . set/a len+=%%a&set $=!$:~%%a!
  117. set $=!$!fedcba9876543210&set/a len+=0x!$:~16,1!
  118. endlocal&set %2=%len%&goto :eof
  119. :jia
  120. setlocal
  121. set a=%~1
  122. set b=%~2
  123. set t=0
  124. set "s="
  125. for /l %%a in (-1 -1 -%~3) do (
  126.     if "!a:~%%a,1!" equ "." (
  127.       set s=.!s!
  128.     ) else (
  129.         set /a "c=t+!a:~%%a,1!+!b:~%%a,1!"
  130.         if !c! geq 10 (set t=1) else set t=0
  131.         set s=!c:~-1!!s!
  132.     )
  133. )
  134. if %t% equ 1 (set s=1!s!)
  135. for /f "tokens=1,2 delims=." %%a in ("%s%") do (
  136.     for /f "tokens=1* delims=0" %%c in (".%%b") do if "%%c%%d" equ "." set s=%%a
  137. )
  138. endlocal&set %~4=%s%&goto :eof
  139. :jian
  140. setlocal
  141. if "%~1" lss "%~2" (
  142.     set a=%~2
  143.     set b=%~1
  144. ) else (
  145.     set a=%~1
  146.     set b=%~2
  147. )
  148. set t=0
  149. set "s="
  150. for /l %%a in (-1 -1 -%~3) do (
  151.     if "!a:~%%a,1!" equ "." (
  152.       set s=.!s!
  153.     ) else (
  154.         set /a "c=10+!a:~%%a,1!-!b:~%%a,1!-t"
  155.         if !c! lss 10 (set t=1) else set t=0
  156.         set s=!c:~-1!!s!
  157.     )
  158. )
  159. for /f "tokens=1,2 delims=." %%a in ("%s%") do (
  160.     for /f "tokens=* delims=0" %%c in ("%%a") do if "%%c" equ "" (set pre=0) else set pre=%%c
  161.     for /f "tokens=* delims=0" %%c in ("%%b") do if "%%c" equ "" (set s=!pre!) else set s=!pre!.%%b
  162. )
  163. endlocal&set %~4=%s%&goto :eof
复制代码

作者: happy886rr    时间: 2017-1-23 23:00

本帖最后由 happy886rr 于 2017-1-23 23:02 编辑

回复 15# pcl_test
相当严谨,颇具正则之风。仿佛在读一篇精美的散文。
作者: gudou    时间: 2024-4-29 15:25

收藏了,太感谢了!!厉害




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