本帖最后由 梦想种子 于 2013-4-28 17:20 编辑
算法思路由 terse 提出。
晚辈只是扩展了可行数域和一点精度。- @echo off
- set MAX=2147483647
- :begin
- cls
- set /p n=输入待开方数(1~%MAX%):
- set a=2
- set r=
- :int_part
- set /a old_a=a,a=(n/a+a)/2
- if %old_a% lss %a% goto int_part
- set /a delta=old_a-a
- if %delta% gtr 1 goto int_part
- ::prepare
- set /a near_n=a*a
- if %near_n% equ %n% goto end
- set /a t=n-near_n,u=a
- :dec_part
- set /a t*=100,d=10,tol_d=MAX/(u*20)
- if %tol_d% lss 9 goto end
- if %t% lss 0 goto end
- :try_d
- set /a d-=1,v=d*(d+u*20)
- if %v% gtr %t% goto try_d
- set /a t-=v,u=u*10+d
- set r=%r%%d%
- goto dec_part
- :end
- if "%r%" neq "" set a=%a%.%r%
- echo 结果:%a%
- pause>nul
- goto begin
复制代码 2013.4.28更新:提高了被开方数定义域,提高了低段数字的精度,修正一些bug。 |