对于超大数的除法,本人有一个算法,如下:
前提是要有一个超大数减法的函数.
举个例子来说明吧:
比如用977除以41,
1.首先取被除数中和除数一样长的位数来减除数,即97-41,余56,给商+1
2.再用56-41,余15,再给商+1
3.再用15-41,结果为负,商的第一位即为2
4.用余数15加上后一位数字(7),再继续减41,即157-41,余116,给商的第二位+1
5.再用116-41,余75,给商的第二位+1
6.再用75-41,余34,给商的第二位+1
7.再用34-41,结果为负,得商的第二位为3
8.由于被除数已经用完,得最终的结果为:977/41=23
下面是本人做的减法函数和整数除法(未做成函数),目前这个除法计算还不支持浮点运算,希望这两个代码对随风大人有些许帮助...
减法函数:
- @echo off
- if "%1"=="" goto :hlp
- setlocal enableextensions
- for %%a in (jie mm mn tm) do (set %%a=0)
- for %%a in (baoliu fu last_ans m n no tmp_) do (set %%a=)
- set beij=%1
- set jian=%2
- rem 把被减数首位除0
- :cut1
- if "%beij:~,1%"=="0" (
- if not "%beij:~1%"=="" (
- if not "%beij:~1,1%"=="." (
- set beij=%beij:~1%
- goto :cut1
- )))
- rem 把减数首位除0
- :cut2
- if "%jian:~,1%"=="0" (
- if not "%jian:~1%"=="" (
- if not "%jian:~1,1%"=="." (
- set jian=%jian:~1%
- goto :cut2
- )))
- rem 判断保留小数的位数
- if not "%4"=="" (
- if "%4"=="0" (
- set no=no
- ) else (
- set baoliu=%4
- )
- )
- rem 把被减数和减数分为整数和小数两个部分
- for /f "tokens=1,2 delims=." %%a in ("%beij%") do (
- set "stral=%%a"&set "strar=%%b"
- )
- for /f "tokens=1,2 delims=." %%a in ("%jian%") do (
- set "strbl=%%a"&set "strbr=%%b"
- )
- rem 如果不保留小数,则跳过对小数部分的计算
- if defined no (
- set stra=%stral%
- set strb=%strbl%
- goto :agn1
- )
- rem 如果没有小数,则跳过对小数部分的计算
- if "%strar%"=="" (
- if "%strbr%"=="" (
- set no=no
- set stra=%stral%
- set strb=%strbl%
- goto :agn1
- )
- )
- rem 计算被减数小数部分的位数
- set "tmp_=%strar%"
- :cnt1
- if defined tmp_ (
- set /a mm+=1
- set tmp_=%tmp_:~1%
- goto :cnt1
- )
- set "bu0=%mm%"
- rem 计算减数小数部分的位数
- set "tmp_=%strbr%"
- :cnt2
- if defined tmp_ (
- set /a mn+=1
- set tmp_=%tmp_:~1%
- goto :cnt2
- )
- if %mn% gtr %mm% set bu0=%mn%
- rem 将两个减数的小数部分对齐
- for /l %%a in (1 1 %bu0%) do (call set bu=%%bu%%0)
- set strar=%strar%%bu%
- set strbr=%strbr%%bu%
- call set strar=%%strar:~,%bu0%%%
- call set strbr=%%strbr:~,%bu0%%%
- set "bu="
- rem 如果定义小数位数,则取定义的位数
- if defined baoliu (
- for /l %%a in (1 1 %baoliu%) do (call set bu=%%bu%%0)
- call set strar=%strar%%%bu%%
- call set strbr=%strbr%%%bu%%
- call set stra=%stral%%%strar:~,%baoliu%%%
- call set strb=%strbl%%%strbr:~,%baoliu%%%
- ) else (
- set stra=%stral%%strar%
- set strb=%strbl%%strbr%
- )
- rem 计算被减数整数部分的位数
- :agn1
- set /a m+=1
- if not "%stral:~1%"=="" (set stral=%stral:~1%&goto :agn1)
- rem 计算减数整数部分的位数
- :agn2
- set /a n+=1
- if not "%strbl:~1%"=="" (set strbl=%strbl:~1%&goto :agn2)
- rem 判断正负
- if %n% gtr %m% (
- set fu=fu
- set "beijshu=%strb%"
- set "jianshu=%stra%"
- ) else (
- if "%n%"=="%m%" (
- set tmp1=%stra%
- set tmp2=%strb%
- goto :pk
- ) else (
- set "beijshu=%stra%"
- set "jianshu=%strb%"
- )
- )
- rem 计算
- :agn
- set /a sth=%beijshu:~-1%-%jianshu:~-1%-%jie%
- if %sth% lss 0 (
- set jie=1
- set /a sth+=10
- ) else (
- set jie=0
- )
- set last_ans=%sth%%last_ans%
- if not "%beijshu:~,-1%"=="" (
- if not "%jianshu:~,-1%"=="" (
- set "beijshu=%beijshu:~,-1%"&set "jianshu=%jianshu:~,-1%"&goto :agn
- ) else (
- set "beijshu=%beijshu:~,-1%"&set "jianshu=0"&goto :agn
- )
- )
- rem 不保留小数的除0以及正负数处理
- :cut0
- if defined no (
- if not "%last_ans:~,1%"=="0" (
- if not defined fu (
- endlocal&set %3=%last_ans%&goto :eof
- ) else (
- endlocal&set %3=-%last_ans%&goto :eof
- )
- ) else (
- set last_ans=%last_ans:~1%
- goto :cut0
- )
- )
- rem 对小数点进行定位
- if defined baoliu (
- call set last_ans=%%last_ans:~,-%baoliu%%%.%%last_ans:~-%baoliu%%%
- ) else (
- if bu0 gtr 0 (
- call set last_ans=%%last_ans:~,-%bu0%%%.%%last_ans:~-%bu0%%%
- )
- )
- rem 首位除0处理
- :cut_
- if "%last_ans:~,1%"=="0" (
- if not "%last_ans:~1,1%"=="." (
- set last_ans=%last_ans:~1%
- goto :cut_
- )
- )
- rem 正负处理
- if defined fu (
- set last_ans=-%last_ans%
- )
- rem 退出脚本
- endlocal&set %3=%last_ans%&goto :eof
- rem 判断相同位数的大小
- :pk
- if %tmp1:~,1% gtr %tmp2:~,1% (
- set beijshu=%stra%
- set jianshu=%strb%
- goto :agn
- ) else (
- if %tmp2:~,1% gtr %tmp1:~,1% (
- set fu=fu
- set beijshu=%strb%
- set jianshu=%stra%
- goto :agn
- ) else (
- if not "%tmp1:~1%"=="" (
- set tmp1=%tmp1:~1%
- set tmp2=%tmp2:~1%
- goto :pk
- ) else (
- endlocal&set %3=0&goto :eof
- )
- )
- )
- :hlp
- color 1f
- echo.&echo 使用方法:
- echo.&echo 1.把本批处理脚本命名为 jianfa.bat 复制到系统目录里
- echo.&echo 2.不带参数运行本批处理脚本显示此帮助信息
- echo.&echo 3.格式: call jianfa.bat 参数1 参数2 参数3 [参数4]
- echo.&echo 参数1 为被减数
- echo.&echo 参数2 为减数
- echo.&echo 参数3 为变量名
- echo.&echo [参数4] 可选参数,为保留小数位数,如不选则保留原有小数.
- echo.&echo 4.例: call jianfa.bat 100 123.456789 ans 2
- echo.&echo 意思为给变量 ans 赋值,其值等于 100 减去 123.456789 的差,
- echo.&echo 并保留两位小数,结果为: -23.45
- echo.&set/p= 按任意键退出...nul&color&goto :eof
复制代码
整数除法:
- @echo off
- Setlocal Enabledelayedexpansion
- :bgn
- set "last_ans="
- for %%a in (fu m m1 n1) do (set %%a=0)
- set /p beichu=被除数:
- if "%beichu:~,1%"=="-" (
- set /a fu+=1
- set beichu=%beichu:~1%
- ) else (
- if "%beichu:~,1%"=="+" (set beichu=%beichu:~1%)
- )
- set /p chu=除 数:
- if "%chu:~,1%"=="-" (
- set /a fu+=1
- set chu=%chu:~1%
- ) else (
- if "%chu:~,1%"=="+" (set chu=%chu:~1%)
- )
- rem 取除数的整数部分
- for /f "delims=." %%a in ("%chu%") do (set chu=%%a)
- :cut
- if "%chu:~,1%"=="0" (
- if not "%chu:~1%"=="" (set chu=%chu:~1%&goto :cut)
- )
- if "%chu%"=="0" (echo 除数不能为0&goto :bgn)
- set strc=%chu%
- rem 取被除数的整数部分
- for /f "delims=." %%a in ("%beichu%") do (set beichu=%%a)
- set strb=%beichu%
- rem 计算被除数的长度
- :cnt1
- set /a m1+=1
- if not "%strb:~1%"=="" (set strb=%strb:~1%&goto :cnt1)
- rem 计算除数的长度
- :cnt2
- set /a n1+=1
- if not "%strc:~1%"=="" (set strc=%strc:~1%&goto :cnt2)
- if %n1% gtr %m1% (echo 商 是:0&echo.&goto :bgn)
- set var=!beichu:~,%n1%!
- :agn
- call jianfa.bat %var% %chu% rslt 0
- if "%rslt:~,1%"=="-" (
- set last_ans=%last_ans%%m%
- set m=0
- if not "!beichu:~%n1%,1!"=="" (
- set var=%var%!beichu:~%n1%,1!
- set /a n1+=1
- goto :agn
- ) else (
- goto :cut0
- )
- ) else (
- set /a m+=1
- set var=%rslt%
- goto :agn
- )
- rem 首位除0处理
- :cut0
- if "%last_ans:~,1%"=="0" (
- if not "%last_ans:~1%"=="" (
- set last_ans=%last_ans:~1%
- goto :cut0
- )
- )
- rem 判断正负
- if "%fu%"=="1" (set last_ans=-%last_ans%)
- echo 商 是:%last_ans%
- echo.&goto :bgn
复制代码
|