
批處理函數大數字加減乘除時期時間計算數字排序進制轉換等最后由 pcl_test 于 -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進制數及 原碼、反碼、補碼:
=====================================================================:nclick="copycode($('code0'));">復制代碼
- @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
=====================================================================:nclick="copycode($('code1'));">復制代碼
- @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
=====================================================================nclick="copycode($('code2'));">復制代碼
- @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
==========================================================================nclick="copycode($('code3'));">復制代碼
- @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
=====================================================================數字排序:nclick="copycode($('code4'));">復制代碼
- @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
=====================================================================:nclick="copycode($('code5'));">復制代碼
- @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
=====================================================================進制轉換(函數)代碼1、 任意進制互轉nclick="copycode($('code6'));">復制代碼
- @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=后)
- call set d=星期%%.%d%%%
- endlocal&set %~3=%yy%-%mm%-%dd% %d%&goto :EOF
- @echo off&color 1f&set /a q=10,h=2
- title 任意進制互轉 默認:%q%進制轉%h%進制
- :start
- setlocal&echo.&echo. 被轉換的數 被轉換數的進制 需轉換成的進制
- echo.&echo. 如:95 16 10表示將 16進制數95 轉換 為10進制數
- echo.&echo. 參數可用分割符為

