本帖最后由 SQYSQYSQY 于 2019-1-29 18:40 编辑
致浏览者,想对大数字(超过1000)计算平方根,请见31楼(约18秒算到150位),想对小数计算平方根,请见34楼(是个文件)(约23秒算到150位)
注意,部分计算器对最后一位进行了四舍五入,本程序可能会与计算器的最后一位相差1。这不是本程序的错误。
致浏览者,被开方数不超过1000,可用下面高效率程序进行计算(约3.5秒算到150位)。 | @echo off & SetLocal EnableDelayedExpansion | | ::变量c的值是被开方数,不得超过1000! | | set c=2 | | for %%a in (16 8 4 2 1) do ( | | set /a "d=(a*%%a<<1)+%%a*%%a+b" | | if !c! geq !d! set /a "a+=%%a","b=d" | | ) | | if !b! equ !c! echo !a! & pause & exit /b | | set /p "=!a!."<nul | | set "d=0" | | for %%a in (512 256 128 64 32 16 8 4 2 1) do ( | | set /a "d+=%%a","e=((a*d<<1)+d*d/1000)/1000+b" | | if !e! geq !c! set /a "d-=%%a" | | ) | | set "e=00!d!" & set /p "=!e:~-3!"<nul | | set /a "e=(!a!!e:~-3!*!a!!e:~-3!)%%1000000","b=e/1000","e=e%%1000" | | set "e= !e!" & set "e=!e:~-3!" | | set "b=000!e!!b!" | | set "e= !d!" | | set "a=!e:~-3!!a!" | | for /l %%a in (3 3 2147483646) do ( | | set "d=0" | | for %%b in (512 256 128 64 32 16 8 4 2 1) do ( | | set /a "d+=%%b" | | if 1000 gtr !d! ( | | set /a "c=d*d/1000" | | for /l %%c in (0 3 %%a) do set /a "c=((!a:~%%c,3!*d<<1)+c+!b:~%%c,3!)/1000" | | set /a "e=%%a+3" | | for %%c in (!e!) do set /a "c+=!b:~%%c,3!" & if !c! geq 1000 set /a "d-=%%b" | | ) else set /a "d-=%%b" | | ) | | set "e=00!d!" & set /p "=!e:~-3!"<nul | | set "c=" & set /a "f=d*d/1000" | | for /l %%b in (0 3 %%a) do ( | | set /a "e=(!a:~%%b,3!*d<<1)+!b:~%%b,3!+f","f=e/1000","e%%=1000" | | set "e= !e!" & set "c=!c!!e:~-3!" | | ) | | set /a "e=(d*d)%%1000" & set "e= !e!" & set "b=000!e:~-3!!c!" | | set "e= !d!" & set "a=!e:~-3!!a!" | | ) | | echo. & pause & exit /bCOPY |
|