[Batch] Función que suma números positivos mayores a 32 bits. v1.2

Iniciado por 0x0309, 14 Abril 2009, 09:29 AM

0 Miembros y 1 Visitante están viendo este tema.

0x0309

:: Hice este código debido al problema que tuvo Leo con la sucesión de Fibonacci.


::
@echo off

setlocal

call :suma 777777777777777777777777  9999999999999999999999999999
echo. 777777777777777777777777 + 9999999999999999999999999999 = %suma%


call :suma 777777777777777777777777 + 9999999999999999999999999999
echo. 777777777777777777777777 + 9999999999999999999999999999 = %suma%

pause

endlocal
goto :eof

::suma dos numeros positivos.
::version 1.2
::Recibe dos numeros en formato de cadena de caracteres.
::Uso:
::call :suma  2147483647 +  10002147483648
::o
::call :suma  2147483647  10002147483648
::Almacena el resultado en la variable suma
::util para sumar numeros mayores a 2147483647 (limite positivo. el rango de 32 bits en cmd solo permite numeros entre -2147483648 y 2147483647 )
::En windows nt y 2000 las cadenas de variables tiene un largo de maximo de 2047 caracteres, y en xp y superior: 8191.
::programado a la rapida por 0x0309
:suma
setlocal enableextensions enabledelayedexpansion
for /f "delims=+ tokens=1,2" %%a in ("%~1+%~2+%~3") do (
set primerNumero=%%a
set segundoNumero=%%b
)

call :len %primerNumero%
set /a lenPrimerNumero=%tam%
call :len %segundoNumero%
set /a lenSegundoNumero=%tam%
if %lenPrimerNumero% gtr %lenSegundoNumero% (
set mayor=primerNumero
set /a len=%lenPrimerNumero%-1
set menor=segundoNumero
) else (
set /a len=%lenSegundoNumero%-1
set mayor=segundoNumero
set menor=primerNumero
)
set /a diferencia=!len%mayor%!-!len%menor%!
set "loQueFalta="
for /l %%a in (1,1,%diferencia%) do (set loQueFalta=!loQueFalta!0)
set %menor%=%loQueFalta%!%menor%!
set /a reserva=0
set "suma="
:ciclo
for /F %%a in ("primerNumero:~!len!,1") do set digitoUno=!%%a!
for /F %%a in ("segundoNumero:~!len!,1") do set digitoDos=!%%a!
set /a sumaDigitos=!digitoUno!+!digitoDos!+!reserva!
set /a digitoResultante=!sumaDigitos!%%10
set /a reserva=!sumaDigitos!-!digitoResultante!
set /a reserva /=10
set suma=!digitoResultante!!suma!
set /a len -=1
if !len! geq 0 goto ciclo
if !reserva! gtr 0 (set suma=!reserva!!suma!)
(
endlocal
set suma=%suma%
)
goto :eof
:len
setlocal
set /a contl=0
set wordl=%~1
:loopl
if not defined wordl (goto endl)
set wordl=%wordl:~1%
set /a contl +=1
goto loopl
:endl
endlocal & set /a tam=%contl%
goto :eof

::