代码已经更新,欢迎测试。
::code by youxi01@cn-dos.net
::乱序数值的提取与计算 Ver 1.30
::解决某些大数字比较时存在的一些问题;
::解决大数字相减时,进退位错误问题。
@echo off
setlocal enabledelayedexpansion
title 乱序数值的提取与计算
color 1f
set "str1=999s999s9999s99999s99999s9999999s9999999999999s99999999999s99999999999s9999999"
set "str2=999888898d9999999999999999999dddddd999999999999999999999999999999999999"
set/a m=0
echo 正在提取str1中的数值...
echo.
echo 提取出的数值有:
echo.
call :GetStr "%str1%"
set Rnum
echo ---------------------------------------
set/a Resstr=1
echo 正在求取str1中各数值之积...
echo.
FOR /F "delims== tokens=2" %%i in ('set Rnum') do call :Multi !Resstr! %%i
set num1=!Resstr!
echo 计算结果为:%num1%
for /l %%i in (1 1 %i%) do set Rnum%%i=
set/a i=0,Resstr=1
echo ---------------------------------------
echo 正在提取str2中的数值...
echo.
echo 提取出的数值有:
echo.
call :GetStr "%str2%"
set Rnum
echo ---------------------------------------
echo 正在求取str2中各数值之积...
FOR /F "delims== tokens=2" %%i in ('set Rnum') do call :Multi !Resstr! %%i
set num2=%Resstr%
echo 计算结果为:%num2%
echo ---------------------------------------
echo 正在比较大小...
echo.
call :GetLen %num1% StrLen
call :GetLen %num2% StrLen_
set "MaxNum=num1" & set "MinNum=num2"
if !StrLen! LSS !StrLen_! (
set "MaxNum=num2" & set "MinNum=num1") else if !StrLen! EQU !StrLen_! (
for /l %%i in (0 1 %StrLen%) do (
set/a ttstr=!num1:~%%i,1!,ttstr_=!num2:~%%i,1!
if !ttstr! LSS !ttstr_! set "MaxNum=num2" & set "MinNum=num1" & GOTO :Res))
:Res
echo %MaxNum% 比 %MinNum% 大
call :Sub !%MaxNum%! !%MinNum%!
for /f "delims=0 tokens=*" %%i in ("!OKstr!") do echo 它们的差值为:%%i
pause>nul
:GetStr OBJ
set "str=%~1"
set/a i=1
for /l %%i in (0 1 1000) do (
set "Tstr=!str:~%%i,1!"
IF "!Tstr!"=="" call :Check Rnum!i! & goto :eof
IF !Tstr! GEQ 0 IF !Tstr! LEQ 9 (call set Rnum!i!=%%Rnum!i!%%!Tstr!) else (
if defined Rnum!i! call :Check Rnum!i! & set/a i+=1))
goto :EOF
:Check OBJ
for /f "delims=0 tokens=*" %%i in ("!%1!") do set %1=%%i
GOTO :EOF
:Split OBJ num(i)Name CX
set Rstr=%~1
if %Rstr% LSS 10000 set "%2!%3!=%Rstr%" & goto :eof
if "%Rstr:~-4%"=="0000" (set/a %2!%3!=0) else set/a %2!%3!=10000%Rstr:~-4%%%10000
set/a %3+=1
call :Split %Rstr:~0,-4% %2 %3
goto :eof
:Multi
set/a m=0,n=0,j=0
set Resstr=
call :Split %1 Snum m
call :Split %2 Snum_ n
for /l %%i in (0 1 %m%) do (
for /l %%j in (0 1 %n%) do (
set/a j=%%i+%%j
set/a ResNum!j!+=!Snum%%i!*!Snum_%%j!))
set/a j+=1,flag=0
for /l %%i in (0 1 %j%) do (
set/a ResNum%%i+=!flag!
if !ResNum%%i! GTR 10000 (
set/a flag=!ResNum%%i:~0,-4!
set ResNum%%i=!ResNum%%i:~-4!) else (
set ResNum%%i=0000!ResNum%%i!
set ResNum%%i=!ResNum%%i:~-4!
set/a flag=0)
set Resstr=!ResNum%%i!!Resstr!)
for /f "delims=0 tokens=*" %%i in ("%Resstr%") do set Resstr=%%i
for /l %%i in (0 1 %j%) do set/a ResNum%%i=0
goto :eof
:Sub MaxNum MinNum
set/a flag1=0,m=0,n=0
call :Split %1 ok m
call :Split %2 ok_ n
for /l %%i in (0 1 %n%) do (
set/a ok%%i-=!ok_%%i!-!flag1!
Call :Check1 ok%%i)
if !flag1! LSS 0 (
set/a n+=1
for /l %%i in (!n! 1 %m%) do (
set/a ok%%i+=!flag1!
call :Check1 ok%%i
)
)
for /l %%i in (0 1 %m%) do set OKstr=!ok%%i!!OKstr!
goto :EOF
:GetLen OBJ Res
set str=%~1
for /l %%i in (0 1 10000) do (
set tmpstr=!str:~%%i,1!
if "!tmpstr!"=="" goto :eof
set/a %2+=1)
goto :EOF
:Check1 OBJ
if !%1! lss 0 (
set/a %1+=10000
set/a flag1=-1) else set/a flag1=0
set %1=0000!%1!
set %1=!%1:~-4!