[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 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
复制代码
1

评分人数

TOP

返回列表