您现在的位置是:网站首页> 编程资料编程资料

批处理bat函数:大数字加减乘除、时期时间计算、数字排序、进制转换等_DOS/BAT_

2023-05-25 117人已围观

简介 批处理bat函数:大数字加减乘除、时期时间计算、数字排序、进制转换等_DOS/BAT_

发几个我的函数

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进制数及 原码、反码、补码

计算任意位数的正整数加法

 @echo off call :jia 354687654165435 35486456 ok echo %ok% pause :jia 加法函数(封装)by @随风 @bbs.bathome.net ::计算任意位数的正整数加法 setlocal enabledelayedexpansion&set f=&set "t=" set var1=%~1&set var2=%~2&set /a j=0,n1=0,n2=0 for /l %%a in (0 1 9) do (set vard1=&set "vard2=" set var1=!var1:%%a= %%a !&set var2=!var2:%%a= %%a !) for %%a in (!var1!)do (set/a n1+=1&set vard1=%%a !vard1!) for %%a in (!var2!)do (set/a n2+=1&set vard2=%%a !vard2!) (if !n1! lss !n2! (set var1=%var2%&set "var2=%var1%" set vard1=%vard2%&set vard2=%vard1%))&set "var2=!var2: =!" for %%a in (!vard1!) do (if "!var2!"=="" set /a var2=0 set /a a=%%a+!var2:~-1!+j&set t=!a:~-1!!t!&set "a=0!a!" set "j=!a:~-2,1!"&set var2=!var2:~0,-1!) if !j! neq 0 set "t=!j!!t!" Endlocal&set %~3=%t%&goto :EOF

计算1000位以内的正整数减法

 @echo off call :jian 354687654165435 35486456 ok echo %ok% pause :jian 减法函数(封装)by @随风 @bbs.bathome.net ::计算1000位以内的正整数减法 setlocal enabledelayedexpansion&&set t=&set f=&set "lin=" for /l %%a in (1 1 10) do set "lin=0000000000!lin!" set lin=!lin!!lin!!lin!!lin!!lin!&set "lin=!lin!!lin!" set var1=!lin!%~1&set var2=!lin!%~2&set vard1=&set/a j=0 set var1=!var1:~-1000!&set "var2=!var2:~-1000!" if "!var1!" lss "!var2!" (set var1=%~2&set "var2=%~1" set "f=-") else set var1=%~1&set "var2=%~2" for /l %%a in (0 1 9) do set "var1=!var1:%%a= %%a !" for %%a in (!var1!) do set "vard1=%%a !vard1!" for %%a in (!vard1!) do (if "!var2!"=="" set/a var2=0 set /a a=%%a-j,b=!var2:~-1! if !a! lss !b! (set /a a+=10,j=1)else set /a j=0 set /a w=a-b&set t=!w!!t!&set var2=!var2:~0,-1!) for /f "tokens=* delims=0" %%a in ("!t!") do ( if "%%a"=="" (set t=0) else set "t=%%a") Endlocal&set %~3=%f%%t%&goto :EOF

计算任意位数的正整数乘法

 @echo off call :cen 354687654165435 35486456 ok echo %ok% pause :cen 乘法函数(封装)by @随风 @bbs.bathome.net ::计算任意位数的正整数乘法 setlocal enabledelayedexpansion if "%~1"=="0" Endlocal&set %~3=0&goto :EOF if "%~2"=="0" Endlocal&set %~3=0&goto :EOF set f=&set jia=&set ji=&set /a n1=0,n2=0 set vard1=&set "vard2="&set var1=%~1&set "var2=%~2" for /l %%a in (0 1 9) do ( set var1=!var1:%%a= %%a !&set var2=!var2:%%a= %%a !) for %%a in (!var1!)do (set /a n1+=1&set vard1=%%a !vard1!) for %%a in (!var2!)do (set /a n2+=1&set vard2=%%a !vard2!) if !n1! gtr !n2! (set vard1=%vard2%&set vard2=%vard1%) for %%a in (!vard1!) do (set "t="&set /a j=0 for %%b in (!vard2!) do (if "!jia!"=="" set /a jia=0 set /a a=%%a*%%b+j+!jia:~-1!&set "t=!a:~-1!!t!" set a=0!a!&set "j=!a:~-2,1!"&set jia=!jia:~0,-1!) set "ji=!t:~-1!!ji!" if "!j:~0,1!"=="0" (set ss=) else set "ss=!j:~0,1!" set jia=!ss!!t:~0,-1!) if not "!j:~0,1!"=="0" set "t=!j:~0,1!!t!" set "ji=!t!!ji:~1!" Endlocal&set %~3=%ji%&goto :EOF

500位内整数除法函数

 @echo off set suru=000012/001200 call :cu0 %suru:/= % ok echo. %ok% pause exit :cu0 500位内整数除法函数(封装)by @随风 bbs.bathome.net ::函数内有 cu1 cu2 cu3 cu4 四个标签,引用时需注意 setlocal enabledelayedexpansion&set "lin=00000" set /a zongw=1000,cs1w=0,cs2w=0,falg=0,x=0 if "!str!"=="1" Endlocal&set %~3=%ff%!num!&goto :EOF if "%~1"=="0" set sang=0&goto cu4 if "!str!"=="0" set sang=以零为除数的错误。&goto cu4 if not defined xiaosu set /a xiaosu=10 for /l %%a in (1 1 5) do set "lin=!lin!!lin!!lin!" set sang=&set ppp=&set var1=%~1&set "var2=%~2" for /f "tokens=* delims=0" %%a in ("!var1!")do set var1=%%a for /f "tokens=* delims=0" %%a in ("!var2!")do set var2=%%a for /l %%a in (0 1 9)do (set "var1=!var1:%%a= %%a !" set "var2=!var2:%%a= %%a !") for %%a in (!var1!) do set /a cs1w+=1 for %%a in (!var2!) do set /a cs2w+=1 for /l %%a in (1 1 10) do (set t=&set cs=%~2&set/a j=0 for /l %%b in (1 1 !cs2w!) do (set /a a=%%a*!cs:~-1!+j set t=!a:~-1!!t!&set a=0!a!&set "j=!a:~-2,1!" set cs=!cs:~0,-1!&set cs%%a=&set "bj%%a=") if !j! neq 0 (set cs%%a=!lin!!j!!t!&set "bj%%a=!j!!t!" ) else set cs%%a=!lin!!t!&set "bj%%a=!t!" set "cs%%a=!cs%%a:~-%zongw%!") set var2=!lin!!var2: =!&set "var2=!var2:~-%zongw%!" set /a cswc=cs1w-cs2w&set "var1=!var1: =!" if !cswc! lss 0 (set cswc=!cswc:-=!&set/a flag=1 for /l %%a in (1 1 !cswc!)do ( if %%a leq 11 set sang=0!sang!&set /a x=cswc-1 set "var1=!var1!0") set "sang=!sang:~0,1!.!sang:~1!") set ppp=!var1:~0,%cs2w%!&set "var1=!var1:~%cs2w%!" if !flag! equ 1 (set /a bul=1) else set /a bul=0 goto cu2 :cu1 if not defined var1 (set "var1=0" if not defined ppp goto cu4 if !flag! equ 0 (set sang=!sang!.&set /a flag=1)) set/a bul=1&set ppp=!ppp!!var1:~0,1!&set "var1=!var1:~1!" :cu2 if !x! geq %xiaosu% goto cu4 set pvar1=!lin!!ppp!&set "pvar1=!pvar1:~-%zongw%!" if "!pvar1!" lss "!var2!" ( if !bul! equ 1 (set sang=!sang!0&set /a bul=0 if !flag! equ 1 set /a x+=1) if "!ppp:~0,1!"=="0" set "ppp=" goto cu1) if !flag! equ 1 set /a x+=1 set /a bul=0 ::计算商 for /l %%a in (1 1 10) do ( if "!cs%%a!" equ "!pvar1!" ( set "sang=!sang!%%a"&set "yu=!bj%%a!"&goto cu3) if "!cs%%a!" gtr "!pvar1!" (set /a s=%%a-1 set "sang=!sang!!s!"&set yu=!t!&goto cu3) set "t=!bj%%a!") :cu3 计算差 set cjs=!ppp!&set cj1=&set m=&set/a jjj=0 for /l %%a in (0 1 9) do set "cjs=!cjs:%%a= %%a !" for %%a in (!cjs!) do set "cj1=%%a !cj1!" for %%a in (!cj1!) do (if "!yu!"=="" set/a yu=0 set /a a=%%a-jjj,b=!yu:~-1! if !a! lss !b! (set /a a+=10,jjj=1)else set/a jjj=0 set /a w=a-b&set m=!w!!m!&set yu=!yu:~0,-1!) for /f "tokens=* delims=0" %%m in ("!m!") do ( if "%%m"=="" (set m=0) else set "m=%%m") if !m! equ 0 ( if "!var1:0=!"=="" set sang=!sang!!var1!&goto cu4 set ppp=&goto cu1) else set "ppp=!m!" goto cu2 :cu4 if "!sang:~0,1!"=="." set "sang=0!sang!" Endlocal&set %~3=%ff%%sang%&goto :EOF

计算时间差

 @echo off set t=%time% call :time0 "%t%" "%time%" ok echo %ok% pause :time0 计算时间差 (封装) @echo off&setlocal&set /a n=0&rem code 随风 @bbs.bathome.net for /f "tokens=1-8 delims=.: " %%a in ("%~1:%~2") do ( set /a n+=10%%a%%100*360000+10%%b%%100*6000+10%%c%%100*100+10%%d%%100 set /a n-=10%%e%%100*360000+10%%f%%100*6000+10%%g%%100*100+10%%h%%100) set /a s=n/360000,n=n%%360000,f=n/6000,n=n%%6000,m=n/100,n=n%%100 set "ok=%s% 小时 %f% 分钟 %m% 秒 %n% 毫秒" endlocal&set %~3=%ok:-=%&goto :EOF

可以处理0开头的数、重复数及200位以内的超大整数(封装)

 @echo off :start setlocal enabledelayedexpansion&cls for /l %%a in (1 1 10) do set str=!str! !random! echo.&echo %str% call :sort "%str%" ok echo %ok% pause>nul endlocal&goto start :sort 可以处理0开头的数、重复数及200位以内的超大整数(封装) @echo off&setlocal enabledelayedexpansion for /f "delims==" %%a in ('set p. 2^>nul')do set "%%a=" for /l %%a in (1 1 20) do set "p.lin=0000000000!p.lin!" for %%a in (%~1) do (set s=!p.lin!%%a&set "s=!s:~-200!" if defined p...!s! (set p..%%a=!p..%%a! %%a set p...!s!=!p..%%a! %%a) else (set p...!s!=%%a)) for /f "tokens=2 delims==" %%a in ('set p...') do ( for %%i in (%%a) do set "p.ok=!p.ok! %%i") endlocal&set %~2=%p.ok:~1%&goto :EOF

计算指定天数 前/后 的日期及星期

 @echo off :start setlocal&cls set /p tian= 请指定要追溯的天数:&echo\ call :Date2Day "%date%" %tian% ok echo %ok% endlocal&pause>nul&goto start :Date2Day 计算指定天数 前/后 的日期及星期 (封装) @echo off&setlocal ENABLEEXTENSIONS for /f "tokens=1-3 delims=/-:\, " %%a in ('echo/%~1') do ( set /a yy=%%a,mm=100%%b%%100,dd=100%%c%%100) set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2 set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633 set /a i=j-%~2,a=i+2472632,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a 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 set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d-4800+m/10 (if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%) for %%a in (一/1 二/2 三/3 四/4 五/5 六/6 日/0) do ( for /f "tokens=1,2 delims=/" %%i in ("%%a")do set %%i=%%j&set ".%%j=%%i") if %~2 gtr 0 (set /a d=^(7-%~2%%7+%date:~-1%^)%%7&set x=前) else ( set /a d=^(~%~2+1+%date:~-1%^)%%7&set x=后
                
                

-六神源码网