Multiplicaciones de números grandes
Visual Basic
2.051 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"; N2N1 = ValidaNumero(N1)
N2 = ValidaNumero(N2)
IF N1 <> "" AND N2 <> "" THEN
P = MultiLng(N1, N2)
PRINT "El producto es: "; PELSE
PRINT "Teclee s¢lo n£meros. No se admiten comas o caracteres distintos a n£meros."END IF
INPUT "¨Otra vez (S/N)"; SoNLOOP 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 THENMultiplicando = LEFT$(Multiplicando, D1 - 1) + MID$(Multiplicando, D1 + 1)
D1 = C1 - D1
END IF
IF D2 > 0 THENMultiplicador = LEFT$(Multiplicador, D2 - 1) + MID$(Multiplicador, D2 + 1)
D2 = C2 - D2
END IF
IF D1 > D2 THENMultiplicador = Multiplicador + STRING$(D1 - D2, Cero)
DP = D1 * 2
ELSEIF D2 > D1 THENMultiplicando = 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 = 0cc = 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 THENN(i) = LTRIM$(STR$(Ll)) + N(i)
END IF
NEXT i
P = SumaLng(N())
' Punto decimal
IF DP > 0 THENC1 = 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 = PEND FUNCTION
FUNCTION RemCeros (Valor AS STRING, Lado AS INTEGER) AS STRING
' Var
DIM C AS STRING * 1DIM 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 THENValor = 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 THENValor = "0" + Valor
END IF
RemCeros = ValorEND FUNCTION
FUNCTION SumaLng (Sumar() AS STRING) AS STRING
' Var
DIM S AS STRING
DIM C AS STRING * 1DIM 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 = 0Li = LBOUND(Sumar)
Ls = UBOUND(Sumar)
' Encuentra si hay puntos decimales
FOR i = Li TO Lsx = INSTR(Sumar(i), Punto)
IF x > 0 THENx = x - LEN(Sumar(i))
IF x > PD THEN PD = xEND IF
END IF
NEXT i
IF PD > 0 THEN ' S¡ hay punto decimal
FOR i = Li TO Lsx = INSTR(Sumar(i), Punto)
IF x = 0 THENSumar(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 LsIF LEN(Sumar(i)) > Ll THEN
Ll = LEN(Sumar(i))
END IF
NEXT i
FOR i = Li TO LsSumar(i) = STRING$(Ll - LEN(Sumar(i)), Cero) + Sumar(i)
NEXT i
' Ahora, suma los n£meros obtenidos
Lc = Ll Ll = 0S = ""
FOR x = Lc TO 1 STEP -1
R = 0 FOR i = Li TO LsC = MID$(Sumar(i), x, 1)
IF C <> Punto THEN
R = R + VAL(C)
END IF
NEXT i
IF C = Punto THENS = C + S
ELSE
R = R + Ll
S = LTRIM$(STR$(R MOD 10)) + S
Ll = FIX(R / 10)
END IF
NEXT x
IF Ll > 0 THENS = LTRIM$(STR$(Ll)) + S
END IF
IF PD THEN
S = RemCeros(S, 0)
END IF
SumaLng = SEND 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 loC = MID$(Numero, l, 1)
IF ASC(C) < 48 OR ASC(C) > 57 THEN
IF C <> "." THEN
IF C <> "-" THEN
Ok = 0EXIT FOR
ELSE
IF NOT S THEN ' ¨Ya se hab¡a contabilizado un gui¢n?
S = -1
ELSE
Ok = 0EXIT FOR
END IF
END IF
ELSE
IF NOT P THEN ' ¨Ya se hab¡a contabilizado un punto?
P = -1
ELSE
Ok = 0EXIT 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 = NumeroELSE
ValidaNumero = ""
END IF
END FUNCTION
No hay comentarios