Descomponer un número
y obtener los factores en una matriz (array)

Fecha: 09/Abr/2005 (03/Abr/05)
Autor: Xabier Oneca, [email protected]

 


Me he dado cuenta de que en la web de El Guille ya hay uno, pero me he fijado que tiene mucho más código que el que yo hice, así que aquí teneis una alternativa más corta. El que vi mostraba los factores a un lado y su exponente a la derecha. El que yo he hecho, en vez de exponente, devuelve todos los factores, aunque estén repetidos.

Lo que hace el código es recorrer, mediante un bucle, desde el 2 hasta el número. En cada loop del bucle, se comprueba si el número se puede dividir por el número actual del bucle. Si se puede dividir, se guarda en la variable lngFactores y se comprueba si se puede volver a dividir por el mismo número (no se incremena el número del bucle). Si la división no da cero como resto, se prueba con el siguiente número.

A continuación el código de Visual Basic. Lo puedes pegar en la parte del código del Form:

' © 2005 Xabier Oneca  --  OnecaSoftware
'
Option Explicit
Private Sub cmdCalcular_Click()
    ' Declarar las variables a utilizar:
    Dim B As Integer          ' Para los bucles.
    Dim lngFactores() As Long ' Este array alojará los factores en los que se
                              ' descompone el número.
    Dim NFacts As Long        ' Número de factores que han aparecido.
    Dim Numero As Long        ' El número que se utiliza para llevar a cabo
                              ' las operaciones.
    Dim strTmp As String      ' Una ayudita para, después, construir una cadena
                              ' de texto que se mostrará en un cuadro de mensaje.
    
    ' Si el número no es entero, convertirlo y mostrarlo redondeado en el TextBox.
    txtNumero = CLng(Val(txtNumero))
    ' Se asigna el número del TextBox a la variable.
    Numero = Val(txtNumero)
    ' Si el número es inferior a 2 ( y mayor que 0), el número está en un factor.
    If Numero >= 0 And Numero < 2 Then
        ReDim lngFactores(0)
        lngFactores(0) = Numero
        GoTo FIN
    End If
    ' Si el numero es negativo, calcular como si fuese uno positivo.
    If Numero < 0 Then Numero = -Numero
    B = 2
    While B <= Numero ' Bucle.
        If Numero Mod B = 0 Then ' Si el numero se puede dividir por B, significa que B
                                 ' es un factor.
            ReDim Preserve lngFactores(NFacts) ' Redimensionar la variable que guarda
                                               ' los factores.
            lngFactores(NFacts) = B ' Guardar el factor en la variable.
            NFacts = NFacts + 1 ' Ahora hay un factor más.
            Numero = Numero \ B ' Se divide el número para buscar otros divisores.
        Else
            ' Si B no es factor, probar con el siguiente número.
            B = B + 1
        End If
    Wend
    ' Ahora todos los factores del número están en la variable lngFactores.
    ' Vamos a hacer que aparezcan en un mensaje multipliándose entre ellos.
    ' (2 * 2 * 3 ...)
    ' Para ello se recorre el array, por medio de un bucle, y se van colocando
    ' en una variable de cadena.
    For B = 0 To UBound(lngFactores)
	        strTmp = strTmp & lngFactores(B) & " * "
	    Next B
    ' Una vez construida la cadena, se muestra el mensaje mostrando los factores.
    MsgBox "El número " & Val(txtNumero) & " descompuesto es: " & Mid(strTmp, 1, Len(strTmp) - 3)
End Sub

Una vez terminado el bucle While, se pueden utilizar los factores para cualquier cosa. Yo en el ejemplo he mostrado todos los factores con el formato a * b * c ... en un MsgBox. Los factores estan en la array lngFactores.

Así, a simple vista, parece que el bucle pueda devolver un factor que no sea primo, pero, lo he comprobado, y no lo devuelve, ya que, por ejemplo, si fuese divisible por 4, ántes hubiera pasado dos veces por el 2 y ya no devolveria 4.

 


ir al índice

Fichero con el código de ejemplo: XabiO_DescomponerNumero.zip - 1.97 KB