Board logo

标题: [原创]实数加减运算脚本! [打印本页]

作者: pengfei     时间: 2006-10-6 23:42    标题: [原创]实数加减运算脚本!

实数加减运算脚本已更新, 功能更加强大.
1.    可以进行多种加减法运算, 如:(X+Y, X-Y, -X+Y, -X-Y).
2.    加入了错误输入的检测.  
3.    运算数不受位数限制, 理论上可以运算N位的范围.
可以替代计算器进行加减法运算. 却不用受位数的限制. 这是该脚本最大的优势.

由于时间关系没有进行全面测试, 不足的地方请指正, 大家一起探讨, 研究~~~!
@echo off
title 实数加减运算脚本
color 27
if not %1*==* set num1=%1 & set num2=%2 & goto jmp
:input
cls
echo                        ╭──────────────╮
echo                        │                            │
echo    ╭─────────┤   实 数 加 减 运 算 脚 本  ├──────────╮
echo    │                  │                            │         [测试版]   │
echo    │                  ╰──────────────╯                    │
echo    │   该脚本理论上可以对N位的实数进行加减运算。                          │
echo    │                                                                      │
echo    │   运算规则:                                                          │
echo    │   输入两个运算数[X]、[Y],程序将自动计算。运算数[X]与[Y]默认为加法   │
echo    │   运算。[x]、[Y]的默认值为正, 也可在前面加"-"号。例:[-X]、[-Y]      │
echo    │                                                                      │
echo    │   + 加法运算请输入第1个[X]运算数后按回车键。接着输入第2个[Y]运算数   │
echo    │   回车即可.   例: [X+Y]                                              │
echo    │   - 减法运算请输入第1个[X]运算数后按回车键。接着输入第2个[-Y]运算数  │
echo    │   注意: 第2个运算数前必须加"-"号.   例: [X+(-Y)]                     │
echo    │   更多的运算表达式:  [(-X)+Y]、[(-X)+(-Y)]                           │
echo    │                                                                      │
echo    │   注意: 除阿拉伯数字外, 第一位允许输入符号"-", 以及最多一个"."号,    │
echo    │   不允许输入其他字符。否则, 都将视为错误输入...                      │
echo    │                                                                      │
echo    │                                     author:pengfei@www.cn-dos.net    │
echo    ╰───────────────────────────────────╯
setlocal enabledelayedexpansion
set num1=
set num2=
set /p num1=    input primary number    [X]:
set /p num2=    input number two number [Y]:
:jmp
set numx=%num1%
set numy=%num2%
set auto=
set less=+
set less_=+
set adding=+
set norm=1
set sign=
set sign_=
if "%num1:~0,1%"=="-" (
    if "%num2:~0,1%"=="-" (
        set num1=!num1:~1!
        set num2=!num2:~1!
        set adding=
        set sign=-
        goto start
    )
)
if "%num1:~0,1%"=="-" (
    set num1=!num1:~1!
    set auto=::
    set less=-
    set less_=-
    set norm=2
    set sign=-
    set sign_=
    goto start
)
if "%num2:~0,1%"=="-" (
    set num2=!num2:~1!
    set auto=::
    set less=-
    set less_=-
    set adding=
    set norm=2
    set sign_=-
    goto start
)
:start
echo %num1% | find "." >nul || set num1=%num1%.0
echo %num2% | find "." >nul || set num2=%num2%.0
if "%num1:~-1%"=="." set num1=%num1%0
if "%num2:~-1%"=="." set num2=%num2%0
if "%num1:~0,1%"=="." set num1=0%num1%
if "%num2:~0,1%"=="." set num2=0%num2%
call :jerque "%num1%"
call :jerque "%num2%"
set num=0
for %%a in (%num1% %num2%) do (
    set /a num+=1
    for /f "tokens=1,2 delims=." %%i in ("%%a") do (
        if "!num!"=="1" (set one=%%i) else (set one_=%%i)
        if "!num!"=="1" (set two=%%j) else (set two_=%%j)
    )
)
call :omit %one%
set one=%want%
call :omit %one_%
set one_=%want%
call :raze %two%
set two=%want_%
call :raze %two_%
set two_=%want_%
if "%one%"=="" set one=0
if "%one_%"=="" set one_=0
call :go %one%
set countx=%wish%
call :go %one_%
set countx_=%wish%
if "%two%"=="" set two=0
if "%two_%"=="" set two_=0
call :go %two%
set county=%wish%
call :go %two_%
set county_=%wish%
set after=
set front=0
if %countx% lss %countx_% (
    set /a result=%countx_%-%countx%
    call :fine !result! %one%
    set one=!incept!
) else (
    set /a result=%countx%-%countx_%
    call :fine !result! %one_%
    set one_=!incept!
)
set after=0
set front=
if %county% lss %county_% (
    set /a result=%county_%-%county%
    call :fine !result! %two%
    set two=!incept!
) else (
    set /a result=%county%-%county_%
    call :fine !result! %two_%
    set two_=!incept!
)
if "%norm%"=="2" (
    call :how %one%%two% %one_%%two_%
)
:recur
if "%mu%"=="2" call :meet
set outcome_=0
call :scale %two% %two_%
set decimal=%numeral:~0,-1%
call :scale %one% %one_%
if "%note%"=="0" (
    set integer=%numeral:~0,-1%
) else (
    set integer=1%numeral:~0,-1%
)
call :raze %decimal%
set decimal=%want_%
call :omit %integer%
set integer=%want%
if "%integer%"=="" set integer=0
if "%integer%"=="0" if "%decimal%"=="" set sign=
if "%decimal%"=="" (set dot=) else (set dot=.)
if "%numx:~0,1%"=="." set numx=0%numx%
if "%numy:~0,1%"=="." set numy=0%numy%
if "%numx:~-1%"=="." set numx=%numx:~0,-1%
if "%numy:~-1%"=="." set numy=%numy:~0,-1%
if "%numx%"=="" set numx=0
if "%numx%"=="-" set numx=-0
if "%numy%"=="-" set numy=-0
cls
echo =============
echo 运算结果^^!
echo =============
echo.
echo.
echo %numx%%adding%%numy%=%sign%%integer%%dot%%decimal%
pause >nul
exit

:scale
set value=@%1
set value_=@%2
set numeral=
:repeat
set outcome=%outcome_%
if "%outcome_:~0,-1%"=="-" (
    set /a outcome=10%outcome_%
    set note=1
) else (
    set note=0
)
set numeral=%outcome:~-1%%numeral%
%auto%set note=0%outcome:~0,-1%
if not "%value:~-1%"=="@" (
    set xx=!value:~-1!
    set value=!value:~0,-1!
)
if not "%value_:~-1%"=="@" (
    set yy=!value_:~-1!
    set value_=!value_:~0,-1!
    call :operation !xx! !yy!
)
goto :eof
:operation
set refer=%1
set refer_=%2
set /a outcome_=%refer%%less%%refer_%%less_%%note%
goto repeat
:go
set remove=%1@
set wish=0
:go_
if not "!remove:~0,1!"=="@" (
    set /a wish+=1
    set remove=!remove:~1!
    goto go_
)
goto :eof
:fine
set take=%1
set incept=%2
:fine_
if not "%take%"=="0" (
    set /a take-=1
    set incept=%front%!incept!%after%
    goto fine_
)
goto :eof
:omit
set want=%1
:omit_
if "%want:~0,1%"=="0" (
    set want=%want:~1%
    goto omit_
)
goto :eof
:raze
set want_=%1
:raze_
if "!want_:~-1!"=="0" (
    set want_=!want_:~0,-1!
    goto raze_
)
goto :eof
:how
set first=%1@
set second=%2@
:how_
if not "%first:~0,1%"=="@" (
    set first_=!first:~0,1!
    set first=!first:~1!
)
if not "%second:~0,1%"=="@" (
    set second_=!second:~0,1!
    set second=!second:~1!
    call :judg
)
goto :eof
:judg
if !first_! gtr !second_! (
    set mu=1
    goto recur
) else (
    if !first_! lss !second_! (
        set mu=2
        goto recur
    )
)
goto how_
:meet
set middle=%one%
set one=%one_%
set one_=!middle!
set middle_=%two%
set two=%two_%
set two_=!middle_!
set sign=%sign_%
goto :eof
:jerque
for /f "tokens=1* delims=." %%i in (%1) do (
    echo %%i%%j|findstr "^[0-9]*$">nul || goto error
)
goto :eof
:error
cls
echo ======================
echo 运算数不符合要求^^!
echo ======================
echo.
echo.
echo 请按任意键重新输入...
pause >nul
goto input
今天中秋节, 祝联盟所有朋友中秋快乐, 学习进步, 天天开心~~~!  送大家一个礼物"浮点数加减运算脚本".

代码刚写出来, 还有很多不足的地方, 大家一起探讨!

先前的代码有一个致使的缺陷, 现已修正. 请测试...
该脚本实现的功能:
1.  可以对浮点数进行加减运算, 有较好的容错性, 如过滤一些不正常输入.
2.  解决了批处理脚本在读取数值时遇到的进制问题, 详情请看下面"关于数值运算时的进制问题"的帖子.
3.  格式输出运算结果, 更加美观.
4.  该脚本可以在CMD下接收变量输入, 也可以直接运行批处理接收运算字符.

感谢qwe1234567版主提供建议和测试脚本!

@echo off
title 浮点数加减运算
mode con: cols=80 lines=25
color 27
echo                        ╭───────────────╮
echo                        │                              │
echo    ╭─────────┤  浮 点 数 加 减 运 算 脚 本  ├─────────╮
echo    │                  │                              │                  │
echo    │                  ╰───────────────╯                  │
echo    │                                                                      │
echo    │    该脚本可以对浮点数进行加减法运算:                                 │
echo    │                                                                      │
echo    │    +加法运算请输入第1个[X]运算数后按回车键. 接着输入第2个[Y]运算数   │
echo    │    回车即可.                                                         │
echo    │                                                                      │
echo    │    -减法运算请输入第1个[X]运算数后按回车键. 接着输入第2个[-Y]运算数  │
echo    │    第2个运算数前必须加"-"号.                                         │
echo    │                                                                      │
echo    │    注意:                                                             │
echo    │    1.整数位最多可运算9位数, 小数位最多可运算8位数.                  │
echo    │    2.小数位整数位加起来最多可运算17位数                             │
echo    │    否则,将会溢出或数值无效!                                         │
echo    │                                                                      │
echo    │                                      author:pengfei@www.cn-dos.net   │
echo    │                                                                      │
echo    ╰───────────────────────────────────╯
if not %1*==* (
    set num1=%1
    set num2=%2
    goto jmp
)
set /p num1=    input primary number:
set /p num2=    input number two number:
:jmp
setlocal enabledelayedexpansion
set numx=%num1%
set numy=%num2%
set adding=+
set tack=1
set tack_=1
set norm=
if "%num2:~0,1%"=="-" (
    set num2=!num2:~1!
    set less=-
    set less_=-
    set adding=-
    set tack=3
    set tack_=1
    set norm=
)
echo %num1% | find "." >nul || set num1=%num1%.0
echo %num2% | find "." >nul || set num2=%num2%.0
if "%num1:~-1%"=="." set num1=%num1%0
if "%num2:~-1%"=="." set num2=%num2%0
if "%num1:~0,1%"=="." set num1=0%num1%
if "%num2:~0,1%"=="." set num2=0%num2%
for %%a in (%num1% %num2%) do (
    set /a num+=1
    for /f "tokens=1,2 delims=." %%i in ("%%a") do (
        if "!num!"=="1" (set one=%%i) else (set one_=%%i)
        if "!num!"=="1" (set two=%%j) else (set two_=%%j)
    )
)
call :raze %two%
set two=%rear%
call :raze %two_%
set two_=%rear%
call :omit %one%
set one=%want%
call :omit %one_%
set one_=%want%
call :go %two%
set count=%wish%
call :go %two_%
set count_=%wish%
if %count% lss %count_% (
    set /a result=%count_%-%count%
    call :fine !result! %two%
    set two=!incept!
) else (
    set /a result=%count%-%count_%
    call :fine !result! %two_%
    set two_=!incept!
)
if "%norm%"==" " (
    if 1%one% lss 1%one_% call :metathesis
    if 1%one% equ 1%one_% (
        if 1%two% lss 1%two_% call :metathesis
    )
)
if "%one%"=="" set one=0
if "%one_%"=="" set one_=0
set /a integer=%one%+%less%%one_%
set /a decimal=%tack%%two%+%less_%%tack_%%two_%
if "%decimal:~0,1%"=="2" (
    set decimal=!decimal:~1!
) else (
    set decimal=!decimal:~1!
    set /a integer%adding%=1
)
if "%decimal%"=="" (set dot=) else (set dot=.)
if "%adding%"=="-" set adding=
if "%numx:~0,1%"=="." set numx=0%numx%
if "%numy:~0,1%"=="." set numy=0%numy%
if "%numx:~-1%"=="." set numx=%numx:~0,-1%
if "%numy:~-1%"=="." set numy=%numy:~0,-1%
cls
echo =============
echo 运算结果^^!
echo =============
echo.
echo %numx%%adding%%numy%=%sign%%integer%%dot%%decimal%
pause >nul
goto :eof

:go
set remove=%1
set wish=0
:go_
if not "!remove:~0,1!"=="~" (
    for /l %%c in (0,1,9) do (
        if "!remove:~0,1!"=="%%c" (
            set /a wish+=1
            set remove=!remove:~1!
            goto go_
        )
    )
)
goto :eof
:fine
set take=%1
set incept=%2
:fine_
if not "%take%"=="0" (
    set /a take-=1
    set incept=!incept!0
    goto fine_
)
goto :eof
:omit
set want=%1
:again
if "%want:~0,1%"=="0" (
    set want=%want:~1%
    goto again
)
goto :eof
:raze
set rear=%1
:raze_
if "!rear:~-1!"=="0" (
    set rear=!rear:~0,-1!
    goto raze_
)
goto :eof
:metathesis
set middle=%one%
set one=%one_%
set one_=!middle!
set middle_=%two%
set two=%two_%
set two_=!middle_!
set sign=-
goto :eof
相关讨论:

[共同参与][挑战思路][批处理处理浮点运算]

关于数值时的进制问题!

[ Last edited by namejm on 2006-10-19 at 00:39 ]
附件 1: 浮点数加减运算脚本.rar (2006-10-7 07:05, 1.49 K, 下载附件所需积分 1点 ,下载次数: 49)
附件 2: 无限制实数加减运算脚本.rar (2006-10-12 11:07, 2.21 K, 下载附件所需积分 1点 ,下载次数: 49)

作者: bg     时间: 2006-10-7 01:51
收藏看看
作者: 不得不爱     时间: 2006-10-7 03:40
应该可以计算到小数点后面9位啊

[ Last edited by qwe1234567 on 2006-10-7 at 03:48 ]
作者: pengfei     时间: 2006-10-7 04:25
不行, 9位会溢出...
111111111.111111111+111111111.111111111=222222223.2072745074  (溢出)

111111111.11111111+111111111.11111111=222222222.22222222  (正常)

本脚本最大运算极限是整数位为9位, 小数位为8位, 加起来最多17位数.

若只有整数则最多能运算9位, 如只有小数则最多可以运算8位.
[ Last edited by pengfei on 2006-10-7 at 06:17 ]
作者: pengfei     时间: 2006-10-7 06:25
发现一个怪现象...
=============
运算结果!         
=============        

2222222222.222222222-1111111111.111111111=1111111111.111111111
  
--------------------------------------------------------------------

=============      
运算结果!   
=============   
                                                      
2222222222.222222222+1111111111.111111111=-961633962.1961633963  

作者: 不得不爱     时间: 2006-10-7 06:37
1:我那个代码却可以算小数位后9位,应该是方法的问题,我的是小数点后首位见0才在首位加1,而你的是所有小数位的首位都加1,所以你的代码小数位要少1位!
2:浮点数的减法运算有点问题: 看下下面的错误:
5.69-65.654=-59.6371
53.698-654.95=-600.16585
作者: pengfei     时间: 2006-10-7 07:04
原来是执行顺序出错了, 代码已修正.

5.69-65.654=-59.964
53.698-654.95=-601.252

版主的代码为分析是零就添1, 当时我也想采用这种方法, 但稍微麻烦一点. 也就没有使用此方案.

而那种方案当小数位第一位为零时照样只能运算8位小数, 并不是都能运算9位小数. 所以我觉得无论是零与否都添1简单一点, 后面也要少用一个判断. 说明也要少一些文字^_^

[ Last edited by pengfei on 2006-10-7 at 07:10 ]
作者: 不得不爱     时间: 2006-10-7 08:11
那种方案当小数位第一位为零时照样能运算9位小数
作者: pengfei     时间: 2006-10-7 08:18
发现的确是这样的, 而我的代码小数第一位为零可以运算9位数, 不为零则只可以运算8位数.
作者: electronixtar     时间: 2006-10-8 05:25
建议pengfei写一个bat的 math library,然后以后大家bat变成就直接include了,^_^
作者: 不得不爱     时间: 2006-10-8 05:57


  Quote:
Originally posted by pengfei at 2006-10-7 06:25:
发现一个怪现象...

[code]
=============
运算结果!         
=============        

2222222222.222222222-1111111111.111111111=1111111111.111111111
  
--------------------------- ...

那是因为在CMD里正数是0~2147483647而负数是-2147483648~-1,2147483648=-2147483648,4294967295=-1

  Quote:
set /a a=2147483647+1
-2147483648
set /a a=2147483649+1
-2147483646


作者: pengfei     时间: 2006-10-12 08:17
看来是跟CMD的数据类型有直接关系, set /a运算时的数据存储类型应该是长整型. 而22...+11...超过了他的最大存储空间, 就会溢出, 所进的位把符号位填满了. 于是出现负数.

而22..-11...却没达到最大存储容量. 因此执行正常.

[ Last edited by pengfei on 2006-10-12 at 08:28 ]
作者: pengfei     时间: 2006-10-12 08:27
实数运算脚本已更新在一楼第1段, 功能更加强大, 无任何限制实现各种加减运算!

欢迎大家测试...
作者: 不得不爱     时间: 2006-10-12 21:27
我也来1个!
@echo off
cls
title 实数加减运算脚本
color 17
setlocal enabledelayedexpansion
if not %1*==* (set num1=%1&if not %2*==* (set num2=%2&goto jmp) ELSE goto err)
:input
echo                                     实 数 加 减 运 算 脚 本
echo.
echo                             该脚本理论上可以对N位的实数进行加减运算
echo.
echo                 注意: 除阿拉伯数字外, 第一位允许输入符号"-", 以及最多一个"."号,
echo                          不允许输入其他字符。否则, 都将视为错误输入...
echo.
echo                                                 中国DOS联盟论坛 qwe1234567制作
set/p num1=请输入第一个小数:
set/p num2=请输入第二个小数:
:jmp
set fh1=
set fh2=
set fh=+
if %num1%*==* goto err
if %num2%*==* goto err
if %num1:~0,1%==- set fh1=-&set num1=%num1:~1%
if %num2:~0,1%==- set fh2=-&set num2=%num2:~1%
if %fh1%*==-* (if %fh2%*==* (set fh=-) else set fh0=-) else if %fh2%*==-* set fh=-
set err=0
echo %num1%|find ".">nul&&set num1=0%num1%0
call :qc %num1% num1
echo %num2%|find ".">nul&&set num2=0%num2%0
call :qc %num2% num2
if %err%==1 goto err
for /f "tokens=1* delims=." %%a in ("%num1%") do (set o1=%%a
set t1=%%b)
for /f "tokens=1* delims=." %%a in ("%num2%") do (set o2=%%a
set t2=%%b)
call :qs0 %o1%
set o1=%sw%
call :qs0 %o2%
set o2=%sw%
call :qw0 %t1%
set t1=%sw%
call :qw0 %t2%
set t2=%sw%
if not %t1%==0 (set o3=%o1%.%t1%) else set o3=%o1%
if not %t2%==0 (set o4=%o2%.%t2%) else set o4=%o2%
call :js %o1%
set s1=%sw%
call :js %o2%
set s2=%sw%
If %s1% Geq %s2% (set/a s3=%s1%-%s2%
call :js0 !s3! %o2%
set o2=!sw!
) ELSE (set/a s3=%s2%-%s1%
call :js0 !s3! %o1%
set o1=!sw!)
call :js %t1%
set s1=%sw%
call :js %t2%
set s2=%sw%
If %s1% Geq %s2% (set/a s3=%s1%-%s2%
call :j0 !s3! %t2%
set t2=!sw!
) ELSE (set/a s3=%s2%-%s1%
call :j0 !s3! %t1%
set t1=!sw!
set s1=%s2%)
set sw=%o1%%t1%
set sw1=%o2%%t2%
:bj
set sw2=1%sw:~0,9%
set sw3=1%sw1:~0,9%
if %sw%*==* goto ksjs
if %sw2% gtr %sw3% goto ksjs
if %sw2% lss %sw3% set fh3=-&goto ksjs
set sw=%sw:~9%
set sw1=%sw1:~9%
goto bj
:ksjs
if %fh3%*==-* (set tmp1=%o2%%t2%&set tmp2=%o1%%t1%) else set tmp1=%o1%%t1%&set tmp2=%o2%%t2%
if %fh3%*==-* (if %fh2%*==-* set fh0=-) else (if %fh1%*==-* set fh0=-)
set jg1=0
set jg=
:js2
set/a jg0=1%tmp1:~-1%%fh%%tmp2:~-1%+%jg1%
set/a jg1=0%jg0:~0,-1%-1
set jg=%jg0:~-1%%jg%
set tmp1=%tmp1:~0,-1%
set tmp2=%tmp2:~0,-1%
if %tmp1%*==* (if %jg1%==1 (set jg=1%jg%&goto xs) ELSE goto xs)
goto js2
:xs
set tmp1=!jg:~-%s1%!
set tmp2=!jg:~0,-%s1%!
call :qw0 %tmp1%
set tmp1=%sw%
call :qs0 %tmp2%
set jg=%sw%.%tmp1%
if %jg:~-1%==0 set jg=%jg:~0,-2%
echo 计算结果是:
if %fh2%*==-* set fh=
echo %fh1%%o3%%fh%%fh2%%o4%=%fh0%%jg%
pause
goto :eof

:qs0
set sw=%1
:qs1
if %sw%==0 goto :eof
if %sw:~0,1%==0 set sw=!sw:~1!&goto qs1
goto :eof
:qw0
set sw=%1
:qw1
if %sw%==0 goto :eof
if %sw:~-1%==0 set sw=!sw:~0,-1!&goto qw1
goto :eof
:js
set sw=0
set sw1=%1
if %sw1%==0 set sw=1&goto :eof
:js1
if not %sw1%*==* set sw1=%sw1:~1%&set/a sw+=1&goto js1
goto :eof
:qc
echo %1|find ".">nul||set %2=%1.0
for /f "tokens=1* delims=." %%i in ("%1") do echo %%i%%j|findstr "^[0-9]*$">nul||set err=1
goto :eof
:j0
set sw=%2
if %1==0 goto :eof
for /l %%c in (1,1,%1) do set sw=!sw!0
goto :eof
:err
echo 你输入了非法字符^!
echo 请重新输入...
goto input
:js0
set sw=%2
if %1==0 goto :eof
for /l %%c in (1,1,%1) do set sw=0!sw!
goto :eof
[ Last edited by qwe1234567 on 2006-10-13 at 01:11 ]
附件 1: 实数加减运算脚本.rar (2006-10-13 01:10, 1.17 K, 下载附件所需积分 1点 ,下载次数: 20)

作者: pengfei     时间: 2006-10-12 23:01
请输入第一个小数:1111111111.1111111111
请输入第二个小数:-1111111111.1111111112
计算结果是:
1111111111.1111111111-1111111111.1111111112=9999999999.9999999999

看了一下, qwe1234567版主的代码写得还是不错. 你在进行各种加减法运算时走了捷径, 走的这个捷径却会出现致命错误. 另外在格式输出上控制得不太严格.

我的代码使用更多的可调用函数来实现各种加减法运算,  完全模拟了真实的人工计算.

[ Last edited by pengfei on 2006-10-12 at 23:10 ]
作者: 不得不爱     时间: 2006-10-12 23:50
已经修改,在格式输出上正常.减法上的错误已经解决!请测试!
1111111111.1111111111-1111111111.1111111112=-0.0000000001
作者: 不得不爱     时间: 2006-10-13 00:02
pengfei:怎么感觉你的代码比我的代码慢多了?
作者: pengfei     时间: 2006-10-13 00:34
比你的是要慢, 测试同样的运算你的为三十多毫秒, 我的为五十来毫秒.

你的代码为小数整数一起运算, 在判断上走了捷径,  我当时编写的初忠是完全模拟人工计算. 因此代码也是最原始的计算方式.

我那段代码中使用的变量更多, 运算更为复杂,这也是影响速度的原因之一. 算法是程序的灵魂, 解决同样的问题效率都会不一样. 由于时间关系, 代码的优化已及更新稍候进行...

[ Last edited by pengfei on 2006-10-13 at 01:18 ]
作者: pengfei     时间: 2006-10-13 00:37
实际以上脚本运算N位的数值范围并不现实, 原因在于环境变量存储空间是有限的...
作者: 不得不爱     时间: 2006-10-13 01:27
代码更新,纠正变量过长时引起比较代码出错的问题!请测试!
作者: pengfei     时间: 2006-10-13 02:00
嘎嘎~~~! 关于一楼第1段代码真是不忍心修改, 虽然算法是最原始的. 但实现这样的算法用批处理的三种基本结构来完成. 自己都有点沾沾自喜, 呵呵~  我的心血呀!!!

还是不打算修改了, 要么就用新的算法写一段新的代码.

兄弟们多多帮忙测试一下一楼第1段代码的BUG...
作者: qasa     时间: 2007-2-23 06:20
看了一下老贴,觉得这贴算法值得大家好好学习下,于是顶上来......
作者: breakme     时间: 2008-11-4 01:04
原来你们早就处理好此事,我还想自己也写个计算器,不过,我想把你们的全部合并,做一个混合运算的calc

有无支持平方根的批处理??
作者: HAT     时间: 2008-11-4 01:32    标题: Re 23楼

多搜索就有了
@echo off
set a=2
set/p p=请输入需要开平方的数字(0~89999999之间)
set/p w=请输入精确到小数点后几位(9以内)
:lp
set /a a=(p/a+a)/2,n=a*a,r=a,y=p-n
if %n% lss 0 goto lp
if %n% gtr %p% goto lp
if %n% equ %p% goto ok
if "%w%"=="" goto ok
set/a m=10,x=r*20,y*=100,b+=1
:lp1
set/a m-=1,s=(x+m)*m
if %s% gtr %y% goto lp1
if %w% neq 0 set/a y-=s,r=r*10+m,t=t*10+m,m=10,x=r*20,y*=100,w-=1&goto lp1
:ok
if not "%t%" == ""  set a=%a%.%t%
echo %p%开平方结果: %a%
pause>nul