Comunidad Underground Hispana  

Retroceder   Comunidad Underground Hispana > Programacion > Batch / Bash-Shell

Like Tree3Me Gusta
  • 1 Post By kevindavid1924
  • 1 Post By kj
  • 1 Post By cristofer007

Respuesta Crear Nuevo Tema
 
Compartir en twitter LinkBack Herramientas Desplegado
Antiguo 04-dic-2012, 22:04   #1
Habitual
 
Avatar de kevindavid1924
 
Fecha de Ingreso: noviembre-2010
Amigos 8
Mensajes: 243
Gracias: 4
Agradecido 24 veces en 18 mensajes.
Lightbulb [BATCH] como multiplicar numeros de longitud indefinida

Es decir; cuando multiplicamos numeros pequeños, [Y con pequeños me refiero a numeros cuyo producto sea menor a 2147483647], no encontramos problema alguno, como 5*4=20, o 20*7=140. Pero cuando operamos con coeficientes mayores, por ejemplo de orden 10^54, nos arroja un error que dice:

Los numeros estan limitados a 32 bits de presicion

es por eso que he escrito un codigo para multiplicar desde numeros pequeños, hasta numeros colosales:

Código:
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

SET /P "A= Numero A>>"
SET /P "B= Numero B>>"

CALL:len %A% L[A]
CALL:len %B% L[B]
SET/A"L[A]-=1,L[B]-=1"

FOR /L %%A IN (%L[A]% -1 0) DO (
	SET/A"ci=cf=0"
	FOR /L %%B IN (%L[B]% -1 0) DO (
		SET /A "op=!ci!+(!A:~%%A,1!*!B:~%%B,1!)"
		IF !op! GTR 9 (
			SET "ci=!op:~0,1!"
			SET "cf=!op:~1,1!"
		) ELSE (
			SET "cf=!op!"
			SET "ci=0"
		)
		SET "c[%%A]=!cf!!c[%%A]!"
	)
	SET "c[%%A]=!ci!!c[%%A]!!d!"
	CALL:len "!c[%%A]!" pc[%%A]
	SET/A"pc[%%A]-=1"
	SET "d=!d!0"
)

SET/A"ci=0"
FOR /L %%X IN (-1 -1 -!pc[0]!) DO (
	SET/A"op=0"
	FOR /L %%Y IN (0 1 %L[A]%) DO (
		IF NOT -!pc[%%Y]! GTR %%X  (
			SET/A"op+=!c[%%Y]:~%%X,1!"
		)
	)
	
		ECHO:
	SET/A"op+=!ci!"
	IF !op! GTR 9 (
		SET "ci=!op:~0,1!"
		SET "cf=!op:~1,1!"
	) ELSE (
		SET "cf=!op!"
		SET "ci=0"
	)
	SET "AxB=!cf!!AxB!"
)
SET "AxB=!ci!!AxB!"

ECHO __________________________
ECHO !AxB!
Pause>nul
EXIT/B0

:len
	SET/P"=%1"<NUL >>~Tmp.tmp
	FOR %%_ IN ("~Tmp.tmp") DO (SET %2=%%~z_)
	DEL/Q ~Tmp.tmp
	EXIT/B0
  
Si entiendes el code:
- Supongase A*B, seria mas rapido multiplicarlos entre si, si A<B, y mas lento A>B
- Algunas veces, el resultado incluira unos ceros al comienzo; supongase A*B, en algunos casos el resultado sera 0AB, o 00AB, esto no quiere decir que el resultado sea en base octal, de igual forma, decidi no escribir unas lineas de codigo extra para eliminar esos posibles 0 a la izquierda, con el fin de ahorrar unas lineas de codigo.
- Pueden mejorar el code, y postearlo aqui mismo, para usarlos todos, o postear algoritmos (o ideas si no sabes programar) mas rapidos, pueden tambien extraer la funcion y acomodarla de tal forma que reciba dos parametros, el resultado estara contenido en %AxB%.

Personalmente lo nombre AxB.Bat

Creo que es un codigo bastante corto y util.
jino139 le gusta esto.
__________________


kevindavid1924 está desconectado   Responder Citando
Los Siguientes 6 Usuarios Agradecieron a kevindavid1924 por Este Mensaje:
Binary_Death (28-dic-2012), cristofer007 (28-dic-2012), cuban (05-dic-2012), diegox64 (06-dic-2012), EleKtro (28-dic-2012), jino139 (08-ene-2013)
Antiguo 28-dic-2012, 11:04   #2
Novato
 
Fecha de Ingreso: febrero-2010
Amigos 2
Mensajes: 39
Gracias: 4
Agradecido 21 veces en 18 mensajes.
Predeterminado Respuesta: [BATCH] como multiplicar numeros de longitud indefinida

Nice!
Yo al final no hice más funciones para saltear las limitaciones de batch operando con números. Sólo hice para trabajar con decimales y para suma y resta de números de cualquier longitud.
Esta es otra función interesante. Bien hecho, así seguro que si alguien quiere hacer una calc científica en batch lo tendrá más fácil

PD: No me gusta ese strlen xDD
__________________
Binary_Death está desconectado   Responder Citando
Los Siguientes 2 Usuarios Agradecieron a Binary_Death por Este Mensaje:
cuban (28-dic-2012), EleKtro (28-dic-2012)
Antiguo 28-dic-2012, 15:17   #3
kj
Experto
 
Fecha de Ingreso: noviembre-2006
Amigos 4
Mensajes: 2.662
Gracias: 3
Agradecido 319 veces en 219 mensajes.
Predeterminado Respuesta: [BATCH] como multiplicar numeros de longitud indefinida

No recuerdo quién pero había alguien en el msn que constantemente me hablaba y preguntaba esto y lo otro mientras intentaba hacer un code como el tuyo.

Buen trabajo, cosas como esta son las que van callando bocas a los que dicen que programar es saber muchos lenguajes xD.

kj
cuban le gusta esto.
__________________
kj está desconectado   Responder Citando
Los Siguientes 2 Usuarios Agradecieron a kj por Este Mensaje:
cuban (29-dic-2012), EleKtro (28-dic-2012)
Antiguo 28-dic-2012, 22:19   #4
Colaborador
 
Avatar de cristofer007
 
Fecha de Ingreso: agosto-2011
Ubicación: Chile, Valparaiso
Amigos 6
Mensajes: 432
Gracias: 58
Agradecido 78 veces en 64 mensajes.
Predeterminado Respuesta: [BATCH] como multiplicar numeros de longitud indefinida

T_T actividad en el foro batch ¡¡¡
Buen code, no recuerdo por que un día tenia la necesidad de multiplicar números colosales ... talves en mi carpeta de batch's encuentre la respuesta , creo que tenia relacion con el dominio mundial y un pan de gengibre ...
cuban le gusta esto.
cristofer007 está desconectado   Responder Citando
El Siguiente Usuario Agradeció a cristofer007 Por Este Mensaje:
cuban (29-dic-2012)
Antiguo 06-ene-2013, 13:30   #5
Habitual
 
Avatar de kevindavid1924
 
Fecha de Ingreso: noviembre-2010
Amigos 8
Mensajes: 243
Gracias: 4
Agradecido 24 veces en 18 mensajes.
Predeterminado Respuesta: [BATCH] como multiplicar numeros de longitud indefinida

Cita:
Iniciado por Binary_Death Ver Mensaje
Nice!
Yo al final no hice más funciones para saltear las limitaciones de batch operando con números. Sólo hice para trabajar con decimales y para suma y resta de números de cualquier longitud.
Esta es otra función interesante. Bien hecho, así seguro que si alguien quiere hacer una calc científica en batch lo tendrá más fácil

PD: No me gusta ese strlen xDD

Postea el de suma y resta, podria extraerlo facilmente de mi code, pero si lo hace con decimales, me ahorraria un poco de trabajo, y asi em motivaria a codear la division con decimales de numeros sin restriccion de tamaño.
__________________


kevindavid1924 está desconectado   Responder Citando
Antiguo 08-ene-2013, 21:27   #6
Novato
 
Fecha de Ingreso: febrero-2010
Amigos 2
Mensajes: 39
Gracias: 4
Agradecido 21 veces en 18 mensajes.
Predeterminado Respuesta: [BATCH] como multiplicar numeros de longitud indefinida

Ok :P
A ver, este es el de sumas y restas con decimales: http://foro.el-hacker.com/f82/batch-...imales-352280/

Este es el de sumas y restas con números de cualquier longitud: http://foro.el-hacker.com/f82/batch-...ngitud-352328/

Y el strlen que uso es este:
Código:
:_strlen
	setlocal
	set/a cnt=0
	for /f "tokens=* eol=" %%_ in (
		'"cmd /u /c echo:%~1|more"'
	) do set/a cnt+=1
	endlocal & exit /b %cnt%
  
Pero no le des importancia a lo que te dije. Simplemente no me gusta porque tiene que escribir en disco, y ¿qué pasa si por cualquier razón no puede? Además que escribir en disco siempre es lento, aunque bueno, son sutilezas.

A ver si lo continúas Si haces uno de multiplicar con decimales, puedes unirlo al que ya tienes y ya con lo programado entre los dos se podrían sumar, restar y multiplicar números con decimales de cualquier longitud (precisión ilimitada). Luego faltaría sólo la división que ya es muy facilita.
__________________
Binary_Death está desconectado   Responder Citando
Antiguo 11-ene-2013, 09:50   #7
Habitual
 
Avatar de kevindavid1924
 
Fecha de Ingreso: noviembre-2010
Amigos 8
Mensajes: 243
Gracias: 4
Agradecido 24 veces en 18 mensajes.
Predeterminado Respuesta: [BATCH] como multiplicar numeros de longitud indefinida

Ahhhh, pense que no los habia visto, xD ese codigo lo use como beta de mi programa.
5x3 es igual a 5 veces 3 asi que hacia 4 llamadas a su programa de sumar con el parametro en 3 + ANS xD

como era muy lento entoncs programe la multiplicacion en papel

No he vuelto a pensar como reducir todo a un solo FOR, es decir que se multiplique y se sume al mismo tiempo, sin embargo sigue abierta la caja de sugerencias
__________________


kevindavid1924 está desconectado   Responder Citando
Antiguo 11-ene-2013, 09:56   #8
Habitual
 
Avatar de kevindavid1924
 
Fecha de Ingreso: noviembre-2010
Amigos 8
Mensajes: 243
Gracias: 4
Agradecido 24 veces en 18 mensajes.
Predeterminado Respuesta: [BATCH] como multiplicar numeros de longitud indefinida

Ammm, olvide algo.

Cuando llegue el momento de hacer la division de numeros grandisimos, tendre que hacer comprobaciones de tamaño entre numeros. pero surge el problema de que hacer:

IF 98862139487162938476918273468972134 GTR 9812739182398273918237 (comando)

no funciona, osea da un resultado probablemente mentiroso, o con suerte verdadero

Hay alguna forma de hacer que funcione?, o tendre que codear una funcion que lo haga?

pd: Programarla seria facil, pregunto para saber si me puedo ahorrar unas lineas de codigo.
__________________


kevindavid1924 está desconectado   Responder Citando
Antiguo 15-ene-2013, 23:17   #9
kj
Experto
 
Fecha de Ingreso: noviembre-2006
Amigos 4
Mensajes: 2.662
Gracias: 3
Agradecido 319 veces en 219 mensajes.
Predeterminado Respuesta: [BATCH] como multiplicar numeros de longitud indefinida

mmm, pues yo que tu comprobaba la longitud de las cadenas y luego uno a uno los dígitos, es lo único que se me ocurre en estos momentos.

Para ahorrar lineas, pues simple: Haslo recursivo :P

kj
__________________
kj está desconectado   Responder Citando
Antiguo 16-ene-2013, 18:11   #10
Habitual
 
Avatar de kevindavid1924
 
Fecha de Ingreso: noviembre-2010
Amigos 8
Mensajes: 243
Gracias: 4
Agradecido 24 veces en 18 mensajes.
Predeterminado Respuesta: [BATCH] como multiplicar numeros de longitud indefinida

pues ese dia que escribi, se me ocurrio unas lineas sencillas,

-Compruebo cual cadena tiene mas caracteres, la que tenga mas, sera la mayor.
-en caso de que sean del mismo largo, comprueblo, el primero, o el segundo, o el tercero, hasta que alguno sea mayor.
-en caso de que ambos numeros sean exacta y estupidamente iguales, significa que mi codigo [el de division, no el de calcular cual numero es mayor] tiene algun error.

total, 2 llamadas a funcion, 1 IF, y dado el caso 1 FOR con 1 IF por dentro: 4 lineas de codigo, o haciendolo ordenadito y en mayuscula como me gusta, 6.
__________________


kevindavid1924 está desconectado   Responder Citando
Antiguo 19-ene-2013, 12:44   #11
Habitual
 
Avatar de kevindavid1924
 
Fecha de Ingreso: noviembre-2010
Amigos 8
Mensajes: 243
Gracias: 4
Agradecido 24 veces en 18 mensajes.
Predeterminado Respuesta: [BATCH] como multiplicar numeros de longitud indefinida

Cita:
Iniciado por kj Ver Mensaje
mmm, pues yo que tu comprobaba la longitud de las cadenas y luego uno a uno los dígitos, es lo único que se me ocurre en estos momentos.

Para ahorrar lineas, pues simple: Haslo recursivo :P

kj
Escuchando megadeth cai en cuenta de que no se que significa recursivo, osea, como quedaria un code como este en forma recursiva?
__________________


kevindavid1924 está desconectado   Responder Citando
Antiguo 19-ene-2013, 15:52   #12
Un poco vago y
 
Avatar de SmartGenius
 
Fecha de Ingreso: mayo-2009
Ubicación: En otro planeta
Amigos 5
Mensajes: 354
Gracias: 0
Agradecido 113 veces en 31 mensajes.
Predeterminado Respuesta: [BATCH] como multiplicar numeros de longitud indefinida

Miniscript de multiplicacion de numeros "recursivo", usar "script.bat N1 N2" devuelve resultado en variable %R%.

Código:
@Echo Off
Set /a "R=0,C=1"
:Mult
Set /a "R=%~1+%~3,C+=1" 2>nul
If %C% GTR %~2 (Echo.%R% &Goto :Eof)
Call :Mult %~1 %~2 %R%
  
SmartGenius está desconectado   Responder Citando
Antiguo 19-ene-2013, 17:52   #13
Habitual
 
Avatar de kevindavid1924
 
Fecha de Ingreso: noviembre-2010
Amigos 8
Mensajes: 243
Gracias: 4
Agradecido 24 veces en 18 mensajes.
Predeterminado Respuesta: [BATCH] como multiplicar numeros de longitud indefinida

MM entiendo, aunque me referia al de saber el mayor de dos numeros de longitud indefinida

recursivo significa una funcion que se autollame hasta terminar el proceso?
__________________



Última edición por kevindavid1924; 19-ene-2013 a las 18:08
kevindavid1924 está desconectado   Responder Citando
Antiguo 20-ene-2013, 19:21   #14
Novato
 
Fecha de Ingreso: febrero-2010
Amigos 2
Mensajes: 39
Gracias: 4
Agradecido 21 veces en 18 mensajes.
Predeterminado Respuesta: [BATCH] como multiplicar numeros de longitud indefinida

Cita:
Iniciado por kevindavid1924 Ver Mensaje
Ammm, olvide algo.

Cuando llegue el momento de hacer la division de numeros grandisimos, tendre que hacer comprobaciones de tamaño entre numeros. pero surge el problema de que hacer:

IF 98862139487162938476918273468972134 GTR 9812739182398273918237 (comando)

no funciona, osea da un resultado probablemente mentiroso, o con suerte verdadero

Hay alguna forma de hacer que funcione?, o tendre que codear una funcion que lo haga?

pd: Programarla seria facil, pregunto para saber si me puedo ahorrar unas lineas de codigo.
Código:
:_hst
	setlocal enabledelayedexpansion
	call :_strlen "%~1" & set/a n[0]=!errorlevel!
	call :_strlen "%~2" & set/a n[1]=!errorlevel!
	if %n[0]% EQU %n[1]% set "s_0=%~1" & set "s_1=%~2" & goto :_endhst
	set/a hst=0,nhst=1
	if %n[1]% GTR !n[%hst%]! set/a hst=1,nhst=0
	set/a l_0=!n[%hst%]!-!n[%nhst%]!
	shift/0 & call set "s_0=%%~%hst%" & call set "s_1=%%~%nhst%"
	for /l %%_ in (1,1,%l_0%) do call set "s_1=0!s_1!"
	:_endhst
	for /f %%_ in ('"(echo:%s_0%&echo:%s_1%)|sort"') do set "hst=%%_"
	endlocal & set "hst=%hst%" & exit /b
  
Esta es la función que había programado para saltar el problema que a ti también se te presenta :P

Suerte.
__________________
Binary_Death está desconectado   Responder Citando
Respuesta

Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder mensajes
No puedes subir archivos adjuntos
No puedes editar tus mensajes

Los Códigos BB están Activado
Las Caritas están Activado
[IMG] está Activado
El Código HTML está Desactivado
Trackbacks están Activado
Pingbacks están Activado
Refbacks están Activado



Temas Similares
Tema Autor Foro Respuestas Último mensaje
Galeria De Regalos a zolo y Sus Pequeñas Historias 67 F, 37 Diseñadores (24-03-13) zolo Taller De Diseño 22 24-mar-2013 13:37
El sendero del hacker arcangel_night Hack para newbies 34 26-dic-2012 17:41
DUELO empate CARLOS_ CUBAN-HACK cuban-hack CodeCommand 87 07-may-2012 23:20
Cómo convertirse en hacker Besti4 HacK GeneraL 2 04-abr-2011 01:51



Portal Hacker
Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.0