Multiplicaciones de números grandes
Visual Basic
1.853 visualizaciones desde el 5 de Abril del 2018
' Multiplicaci¢n de n£meros grandes
OPTION EXPLICIT
' Funciones
DECLARE FUNCTION ValidaNumero (Numero AS STRING) AS STRING
DECLARE FUNCTION MultiLng (Multiplicando AS STRING, Multiplicador AS STRING) AS STRING
DECLARE FUNCTION RemCeros (Valor AS STRING, Lado AS INTEGER) AS STRING
DECLARE FUNCTION SumaLng (Sumar() AS STRING) AS STRING
' Var
DIM N1 AS STRING, N2 AS STRING, P AS STRING
DIM SoN AS STRING
CLS
DO
INPUT "¨Cu l es el multiplicando"; N1
INPUT "¨Cu l es el multiplicador"; N2
N1 = ValidaNumero(N1)
N2 = ValidaNumero(N2)
IF N1 <> "" AND N2 <> "" THEN
P = MultiLng(N1, N2)
PRINT "El producto es: "; P
ELSE
PRINT "Teclee s¢lo n£meros. No se admiten comas o caracteres distintos a n£meros."
END IF
INPUT "¨Otra vez (S/N)"; SoN
LOOP UNTIL UCASE$(SoN) = "N"
END
FUNCTION MultiLng (Multiplicando AS STRING, Multiplicador AS STRING) AS STRING
' Var
DIM M1 AS INTEGER
DIM M2 AS INTEGER
DIM R AS INTEGER
DIM Ll AS INTEGER
DIM P AS STRING
DIM C1 AS INTEGER
DIM C2 AS INTEGER
DIM i AS INTEGER
DIM x AS INTEGER
DIM cc AS INTEGER
DIM S1 AS INTEGER
DIM S2 AS INTEGER
DIM D1 AS INTEGER
DIM D2 AS INTEGER
DIM DP AS INTEGER
DIM N() AS STRING
DIM C AS STRING
CONST Punto = "."
CONST Cero = "0"
CONST Guion = "-"
' Iniciaci¢n para respetar la ley de los signos
S1 = LEFT$(Multiplicando, 1) = Guion
S2 = LEFT$(Multiplicador, 1) = Guion
IF S1 THEN Multiplicando = MID$(Multiplicando, 2)
IF S2 THEN Multiplicador = MID$(Multiplicador, 2)
' Localizaci¢n del punto decimal
D1 = INSTR(Multiplicando, Punto)
D2 = INSTR(Multiplicador, Punto)
' Valores iniciales
C1 = LEN(Multiplicando)
C2 = LEN(Multiplicador)
cc = 0
' Si hay punto decimal, lo quita
IF D1 > 0 THEN
Multiplicando = LEFT$(Multiplicando, D1 - 1) + MID$(Multiplicando, D1 + 1)
D1 = C1 - D1
END IF
IF D2 > 0 THEN
Multiplicador = LEFT$(Multiplicador, D2 - 1) + MID$(Multiplicador, D2 + 1)
D2 = C2 - D2
END IF
IF D1 > D2 THEN
Multiplicador = Multiplicador + STRING$(D1 - D2, Cero)
DP = D1 * 2
ELSEIF D2 > D1 THEN
Multiplicando = Multiplicando + STRING$(D2 - D1, Cero)
DP = D2 * 2
ELSE
DP = D1 * 2
END IF
' Restablece las longitudes
C1 = LEN(Multiplicando)
C2 = LEN(Multiplicador)
REDIM N(1 TO C2) AS STRING
' Obtiene los n£meros de la multiplicaci¢n
FOR i = C2 TO 1 STEP -1 ' Multiplicador
N(i) = STRING$(cc, Cero) ' Cu ntos ceros agrega
M2 = VAL(MID$(Multiplicador, i, 1))
Ll = 0
cc = cc + 1
FOR x = C1 TO 1 STEP -1
M1 = VAL(MID$(Multiplicando, x, 1))
R = M1 * M2
R = R + Ll
N(i) = LTRIM$(STR$(R MOD 10)) + N(i)
Ll = FIX(R / 10)
NEXT x
IF Ll > 0 THEN
N(i) = LTRIM$(STR$(Ll)) + N(i)
END IF
NEXT i
P = SumaLng(N())
' Punto decimal
IF DP > 0 THEN
C1 = LEN(P)
IF DP <= C1 THEN
P = LEFT$(P, C1 - DP) + Punto + RIGHT$(P, DP)
ELSE
P = Punto + STRING$(DP - C1, Cero) + RIGHT$(P, DP)
END IF
PRINT P
P = RemCeros(P, 1)
ELSE
P = RemCeros(P, 2)
END IF
' Ley de los signos
IF S1 <> S2 THEN
P = Guion + P
END IF
MultiLng = P
END FUNCTION
FUNCTION RemCeros (Valor AS STRING, Lado AS INTEGER) AS STRING
' Var
DIM C AS STRING * 1
DIM PD AS INTEGER
CONST Punto = "."
CONST Cero = "0"
' Los ceros a la derecha primero
IF Lado = 1 OR Lado = 0 THEN ' Derecha o ambos
PD = (INSTR(Valor, Punto) > 0)
IF PD THEN
DO
C = RIGHT$(Valor, 1)
IF C = Cero OR C = Punto THEN
Valor = LEFT$(Valor, LEN(Valor) - 1)
END IF
LOOP UNTIL C <> Cero OR C = Punto
C = ""
END IF
END IF
' Ahora, los ceros a la izquierda
IF Lado = 2 OR Lado = 0 THEN ' S¢lo izquierda
DO
C = LEFT$(Valor, 1)
IF C = Cero THEN
Valor = MID$(Valor, 2)
END IF
LOOP UNTIL C <> Cero
END IF
' Verifica que lo primero que aparezca no sea un punto
C = LEFT$(Valor, 1)
IF C = Punto THEN
Valor = "0" + Valor
END IF
RemCeros = Valor
END FUNCTION
FUNCTION SumaLng (Sumar() AS STRING) AS STRING
' Var
DIM S AS STRING
DIM C AS STRING * 1
DIM i AS INTEGER
DIM x AS INTEGER
DIM R AS INTEGER
DIM Ll AS INTEGER
DIM Li AS INTEGER
DIM Ls AS INTEGER
DIM Lc AS INTEGER
DIM PD AS INTEGER
CONST Punto = "."
CONST Cero = "0"
' Valores iniciales
Ll = 0
Li = LBOUND(Sumar)
Ls = UBOUND(Sumar)
' Encuentra si hay puntos decimales
FOR i = Li TO Ls
x = INSTR(Sumar(i), Punto)
IF x > 0 THEN
x = x - LEN(Sumar(i))
IF x > PD THEN
PD = x
END IF
END IF
NEXT i
IF PD > 0 THEN ' S¡ hay punto decimal
FOR i = Li TO Ls
x = INSTR(Sumar(i), Punto)
IF x = 0 THEN
Sumar(i) = Sumar(i) + Punto + STRING$(PD, Cero)
ELSE
Sumar(i) = Sumar(i) + STRING$(PD - LEN(Sumar(i)), Cero)
END IF
NEXT i
END IF
' Ahora, ajusta la longitud de los n£meros obtenidos
FOR i = Li TO Ls
IF LEN(Sumar(i)) > Ll THEN
Ll = LEN(Sumar(i))
END IF
NEXT i
FOR i = Li TO Ls
Sumar(i) = STRING$(Ll - LEN(Sumar(i)), Cero) + Sumar(i)
NEXT i
' Ahora, suma los n£meros obtenidos
Lc = Ll
Ll = 0
S = ""
FOR x = Lc TO 1 STEP -1
R = 0
FOR i = Li TO Ls
C = MID$(Sumar(i), x, 1)
IF C <> Punto THEN
R = R + VAL(C)
END IF
NEXT i
IF C = Punto THEN
S = C + S
ELSE
R = R + Ll
S = LTRIM$(STR$(R MOD 10)) + S
Ll = FIX(R / 10)
END IF
NEXT x
IF Ll > 0 THEN
S = LTRIM$(STR$(Ll)) + S
END IF
IF PD THEN
S = RemCeros(S, 0)
END IF
SumaLng = S
END FUNCTION
FUNCTION ValidaNumero (Numero AS STRING) AS STRING
DIM l AS LONG
DIM lo AS LONG
DIM Ok AS INTEGER
DIM P AS INTEGER
DIM C AS STRING
DIM S AS INTEGER
Numero = LTRIM$(RTRIM$(Numero))
lo = LEN(Numero)
Ok = -1
FOR l = 1 TO lo
C = MID$(Numero, l, 1)
IF ASC(C) < 48 OR ASC(C) > 57 THEN
IF C <> "." THEN
IF C <> "-" THEN
Ok = 0
EXIT FOR
ELSE
IF NOT S THEN ' ¨Ya se hab¡a contabilizado un gui¢n?
S = -1
ELSE
Ok = 0
EXIT FOR
END IF
END IF
ELSE
IF NOT P THEN ' ¨Ya se hab¡a contabilizado un punto?
P = -1
ELSE
Ok = 0
EXIT FOR
END IF
END IF
END IF
NEXT l
' Si es n£mero, devuelva el n£mero
' si no lo es, devuelva una cadena vac¡a
IF Ok THEN
ValidaNumero = Numero
ELSE
ValidaNumero = ""
END IF
END FUNCTION
No hay comentarios