Board logo

标题: 重新练习开平方 [打印本页]

作者: terse     时间: 2008-3-16 19:26    标题: 重新练习开平方

前面有发的在处理小数不是很完善
非常批处理那里的兄弟指出了递减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
好东西,不过运行结果好像有点问题:

F:\test\more\新建文件夹>test
请输入需要开平方的数字(0~321063之间)100
请输入精确到小数点后几位2
100开平方结果: 10.09

F:\test\more\新建文件夹>test
请输入需要开平方的数字(0~321063之间)100
请输入精确到小数点后几位1
100开平方结果: 10.09

F:\test\more\新建文件夹>test
请输入需要开平方的数字(0~321063之间)100
请输入精确到小数点后几位0
100开平方结果: 10.09
作者: moniuming     时间: 2008-3-17 14:53
发现问题了,双击运行不会有这种现象,在命令提示符下运行才会出现这种现象
作者: bushcet     时间: 2008-3-17 14:53    标题: 佩服

佩服佩服佩服!