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

[数值计算] 批处理如何实现超大数除法运算?

本帖最后由 pcl_test 于 2016-9-28 22:06 编辑

各位前辈:
      在DOS下,想通过BAT写一个简单的除法运算,但是DOS只支持32位运算,超过32位就会有问题。
      希望BAT实现此功能,最好精确到小数点后两位,请前辈、高手指教,谢谢啦!!!

      如下为我在运行效果:
      C:\Documents and Settings\user>set /a tmp=998555947008/1000202272768
         无效数字。数字精确度限为 32 位。

代码比较长
  1. @echo off&setlocal enabledelayedexpansion
  2. set str1=998555947008
  3. set str2=1000202272768
  4. set u=2
  5. for %%i in (str1 str2) do if "!%%i:~,1!" == "-" set /a d+=1
  6. if "%d%" == "1" (set d=-) else set "d="
  7. set l=00000000&for /l %%i in (1 1 7) do set "l=!l!!l!"
  8. set "var=4096 2048 1024 512 256 128 64 32 16 8 4 2 1"
  9. for /l %%i in (1 1 2) do (
  10.     set "str%%i=!str%%i:-=!"
  11.     set /a "n=str%%i_2=0"
  12.     for %%a in (!str%%i:.^= !) do (
  13.         set /a n+=1
  14.         set s=s%%a&set str%%i_!n!=0
  15.         for %%b in (%var%) do if "!S:~%%b!" neq "" set/a str%%i_!n!+=%%b&set "S=!S:~%%b!"
  16.         set /a len%%i+=str%%i_!n!
  17.     )
  18.         set str%%i=!str%%i:.=!
  19. )
  20. if !str1_2! gtr !str2_2! (set /a len2+=str1_2-str2_2) else set /a len1+=str2_2-str1_2
  21. for /l %%i in (1 1 2) do (
  22.     set str%%i=!str%%i!!l!
  23.     for %%j in (!len%%i!) do set " str%%i=!str%%i:~,%%j!"
  24. )
  25. for /f "tokens=* delims=0" %%i in ("!str2!") do set s=%%i&set "str2=0%%i"
  26. set len2=1
  27. for %%j in (%var%) do if "!S:~%%j!" neq "" set/a len2+=%%j&set "S=!S:~%%j!"
  28. set /a len=len2+1
  29. if !len1! lss !len2! set len1=!len2!&set "str1=!l:~-%len2%,-%len1%!!str1!"
  30. set /a len1+=u&set str1=0!str1!!l:~,%u%!
  31. set str=!str1:~,%len2%!
  32. set "i=0000000!str2!"&set /a Len_i=Len2+7
  33. for /l %%i in (1 1 9) do (
  34.     set "T=0"
  35.     for /l %%j in (8 8 !Len_i!) do (
  36.         set /a "T=1!i:~-%%j,8!*%%i+T"
  37.         set Num%%i=!T:~-8!!Num%%i!&set /a "T=!T:~,-8!-%%i"
  38.     )
  39.     set Num%%i=!T!!Num%%i!
  40.     set "Num%%i=0000000!Num%%i:~-%Len%!"
  41. )
  42. for /L %%a in (!len2! 1 !Len1!) do (
  43.     set "str=!L!!str!!str1:~%%a,1!"
  44.     set "str=!str:~-%Len%!"
  45.     if "!str!" geq "!str2!" (
  46.        set M=1&set i=0000000!str!
  47.        for /l %%i in (2 1 9) do if "!i!" geq "!Num%%i!" set "M=%%i"
  48.            set sun=!sun!!M!&set str=&set T=0
  49.            for %%i in (!M!) do (
  50.                for /l %%j in (8 8 !Len_i!) do (
  51.                    set /a "T=3!i:~-%%j,8!-1!Num%%i:~-%%j,8!-!T:~,1!%%2"
  52.                    set "str=!T:~1!!str!"
  53.                )
  54.            )
  55.     ) else set sun=!sun!0
  56. )
  57.      set sun=!sun:~,-%u%!.!sun:~-%u%!
  58. echo %d%!sun!
  59. pause
复制代码
1

评分人数

    • 522235677: bat用到炉火纯青地步了,佩服啊技术 + 1

TOP

回复 2# terse


    谢谢您,功能实现了!太厉害了!!!!

TOP

回复 2# terse


    前辈,能否把这算法做成一个方法(公函),用的时候,只需要调用就可以~~~
   
    如:call  :Get_XXXX  bcs cs jg  (bcs被除数、cs除数、jg结果)

TOP

http://bbs.bathome.net/thread-3372-2-1.html
这个里面有封装好的
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 4# strolley
  1. @echo off&setlocal enabledelayedexpansion
  2. call:division 998555947008 1000202272768 quot 2
  3. echo %quot%
  4. pause&exit
  5. :division
  6. setlocal
  7. set str1=%1
  8. set str2=%2
  9. if "%~4" neq "" set u=%4
  10. for %%i in (str1 str2) do if "!%%i:~,1!" == "-" set /a d+=1
  11. if "%d%" == "1" (set d=-) else set "d="
  12. set l=00000000&for /l %%i in (1 1 7) do set "l=!l!!l!"
  13. set "var=4096 2048 1024 512 256 128 64 32 16 8 4 2 1"
  14. for /l %%i in (1 1 2) do (
  15.     set "str%%i=!str%%i:-=!"
  16.     set /a "n=str%%i_2=0"
  17.     for %%a in (!str%%i:.^= !) do (
  18.         set /a n+=1
  19.         set s=s%%a&set str%%i_!n!=0
  20.         for %%b in (%var%) do if "!S:~%%b!" neq "" set/a str%%i_!n!+=%%b&set "S=!S:~%%b!"
  21.         set /a len%%i+=str%%i_!n!
  22.     )
  23.         set str%%i=!str%%i:.=!
  24. )
  25. if !str1_2! gtr !str2_2! (set /a len2+=str1_2-str2_2) else set /a len1+=str2_2-str1_2
  26. for /l %%i in (1 1 2) do (
  27.     set str%%i=!str%%i!!l!
  28.     for %%j in (!len%%i!) do set " str%%i=!str%%i:~,%%j!"
  29. )
  30. for /f "tokens=* delims=0" %%i in ("!str2!") do set s=%%i&set "str2=0%%i"
  31. set len2=1
  32. for %%j in (%var%) do if "!S:~%%j!" neq "" set/a len2+=%%j&set "S=!S:~%%j!"
  33. set /a len=len2+1
  34. if !len1! lss !len2! set len1=!len2!&set "str1=!l:~-%len2%,-%len1%!!str1!"
  35. set /a len1+=u&set str1=0!str1!!l:~,%u%!
  36. set str=!str1:~,%len2%!
  37. set "i=0000000!str2!"&set /a Len_i=Len2+7
  38. for /l %%i in (1 1 9) do (
  39.     set "T=0"
  40.     for /l %%j in (8 8 !Len_i!) do (
  41.         set /a "T=1!i:~-%%j,8!*%%i+T"
  42.         set Num%%i=!T:~-8!!Num%%i!&set /a "T=!T:~,-8!-%%i"
  43.     )
  44.     set Num%%i=!T!!Num%%i!
  45.     set "Num%%i=0000000!Num%%i:~-%Len%!"
  46. )
  47. for /L %%a in (!len2! 1 !Len1!) do (
  48.     set "str=!L!!str!!str1:~%%a,1!"
  49.     set "str=!str:~-%Len%!"
  50.     if "!str!" geq "!str2!" (
  51.        set M=1&set i=0000000!str!
  52.        for /l %%i in (2 1 9) do if "!i!" geq "!Num%%i!" set "M=%%i"
  53.            set sun=!sun!!M!&set str=&set T=0
  54.            for %%i in (!M!) do (
  55.                for /l %%j in (8 8 !Len_i!) do (
  56.                    set /a "T=3!i:~-%%j,8!-1!Num%%i:~-%%j,8!-!T:~,1!%%2"
  57.                    set "str=!T:~1!!str!"
  58.                )
  59.            )
  60.     ) else set sun=!sun!0
  61. )
  62. if defined u if "%u%" gtr "0" set sun=!sun:~,-%u%!.!sun:~-%u%!
  63. endlocal&set %3=%d%%sun%
复制代码

TOP

回复 6# terse


    谢谢,非常感谢您!
  现在想在for循环体内调用division方法,对各磁盘使用率进行计算,并显示各磁盘的使用率,但在调用的时候有点问题,不知调用是否需要for循环实现??请高手指点!

@echo off
setlocal enabledelayedexpansion
echo 11111111111
for /f "skip=1 tokens=1,2,3 delims= " %%i in ('wmic logicaldisk where "drivetype=3" get name^,size^,freespace') do (
set /a n+=1
echo 盘符 %%j 剩余:%%i 空间%%k
set  AAA=%%i
set  BBB=%%k
rem 循环取值
call:division !AAA! !BBB! quot 2 &echo 盘符%%j  剩余为%%j  使用率为%quot%
)
pause

TOP

回复 7# strolley
不清楚你的工作环境 我这里 XP win7 测试通过
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. echo 11111111111
  4. for /f "skip=1 tokens=1,2,3 delims= " %%i in ('wmic logicaldisk where "drivetype=3" get name^,size^,freespace') do (
  5.     for /f %%a in ("%%i") do (
  6.         set /a n+=1
  7.         echo 盘符 %%j 剩余:%%i 空间%%k
  8.         set  AAA=%%i
  9.         set  BBB=%%k
  10.         rem 循环取值
  11.         call:division !AAA! !BBB! quot 2
  12.         echo 盘符%%j  剩余为%%i  使用率为!quot!
  13.     )
  14. )
  15. pause&exit
复制代码

TOP

本帖最后由 PowerShell 于 2014-2-20 16:52 编辑

powershell代码
  1. Get-Volume
复制代码
  获取卷信息,还可以再次基础上进一步计算占有率和剩余率

DriveLetter         FileSystemLabel     FileSystem          DriveType           HealthStatus             SizeRemaining               Size
-----------         ---------------     ----------          ---------           ------------             -------------               ----
C                                       NTFS                Fixed               Healthy                       18.59 GB              46 GB
Z                                       NTFS                Removable           Healthy                       37.74 GB           62.08 GB
K                                       NTFS                Removable           Healthy                       47.64 GB           58.16 GB
D                                       FAT32               Fixed               Healthy                       26.79 GB           30.99 GB
E                                       NTFS                Fixed               Healthy                       194.42 GB          401.08 GB
脚本是写给人看的,是写给用户看的,而不是写给机子看的
用户能看懂、会修改的脚本,才是好脚本。
写易懂的powershell脚本帮人解决问题,进而让用户学会自渔,吾所愿也

TOP

求解释 此大数除法函数的 算法思路 只解释正整数除法思路就行 不用小数除法

TOP

返回列表