前面有发的在处理小数不是很完善
非常批处理那里的兄弟指出了递减M可以省去一个SET 修改下
@echo off
set a=2
set/p p=请输入需要开平方的数字(0~321063之间)
set/p w=请输入精确到小数点后几位
:lp
set /a a=(p/a+a)/2,n=a*a,y=p-n
set r=%a%
if %n% gtr %p% goto lp
if %n% equ %p% goto ok
:lp1
set/a b+=1,m=10,x=r*20,y*=100
:lp2
set/a m-=1,s=(x+m)*m
if %s% gtr %y% goto lp2
set/a y-=s
set r=%r%%m%&set t=%t%%m%
if %w% gtr %b% goto lp1
:ok
if not "%t%" == "" set a=%a%.%t%
echo %p%开平方结果: %a%
pause>nul
[ Last edited by terse on 2008-3-17 at 03:58 PM ]作者: s11ss 时间: 2008-3-16 21:39 看不懂,佩服一下先作者: HAT 时间: 2008-3-16 23:27 能否顺便把算法讲解一下?作者: terse 时间: 2008-3-17 01:12
Quote:
Originally posted by HAT at 2008-3-16 23:27:
能否顺便把算法讲解一下?
:lp
::迭代法算出整数,并得出迭代出整数的平方和%P%的差Y,Y作余数推下,
set /a a=(p/a+a)/2,n=a*a,y=p-n
set r=%a%
if %n% gtr %p% goto lp
if %n% equ %p% goto ok
:lp1
::位移2位Y,即Y*100,从高位往低位推出小数,再从1到9试商Y(大不过9),
::将商的20倍加上这个试商再乘以试商,如果所得的积S小于余数,确定试商M!
set/a b+=1,m=0,x=r*20,y*=100
:lp2
set/a m+=1,s=(x+m)*m
if %s% gtr %y% goto lp3
goto lp2
:lp3
::继续上步,再求余数Y,类推下..
set/a m-=1,s=(x+m)*m,y-=s
set r=%r%%m%&set t=%t%%m%
if %w% equ %b% goto ok
goto lp1作者: moniuming 时间: 2008-3-17 14:46 好东西,不过运行结果好像有点问题: