Comunidad Gambas-es

Versión completa: Descomponer en factores primos
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Buenas!.

Conociendo los caracteres Unicode adecuados para los exponentes (super indices) he podido crear este ejemplo.

GAMBAS
  1. Public Sub Main()
  2.  
  3.   MostrarDescompFact(100)
  4.  
  5.  
  6. Public Sub MostrarDescompFact(numero As Integer)''Mostrar descomposición factorial
  7.  
  8.   Dim valor As String
  9.   Dim cfactores As New Collection
  10.  
  11.   cfactores = Descomponer(numero)
  12.  
  13.   Print numero; " = ";
  14.   For Each valor In cfactores
  15.     Print cfactores.key; String.Chr(DevolverSuperIndice(valor)); "*";
  16.   Next
  17.   Print 1
  18.  
  19.  
  20. Public Sub Descomponer(numero As Integer) As Collection ''Descomponer un números en factores
  21.  
  22.   Dim factores As New Collection
  23.  
  24.   n = 2
  25.  
  26.   While n <= numero
  27.     If numero Mod n = 0 Then
  28.       numero = numero / n
  29.       If Not factores.Exist(n) Then
  30.         factores.Add(1, n)
  31.       Else
  32.         factores[n] += 1
  33.       Endif
  34.     Else
  35.       n += 1
  36.     Endif
  37.   Wend
  38.  
  39.   Return factores
  40.  
  41.  
  42. Public Function DevolverSuperIndice(valor As Integer) As Integer ''Devuelve el carácter unicode de exponente
  43.  
  44.   Dim codigo As Integer
  45.  
  46.   'De esta forma se ve mejor que usando Choose
  47.   'El valor 1 no es posible como exponente
  48.   Select Case valor
  49.     Case 2
  50.       codigo = 178
  51.     Case 3
  52.       codigo = 179
  53.     Case 4
  54.       codigo = &2074
  55.     Case 5
  56.       codigo = &2075
  57.     Case 6
  58.       codigo = &2076
  59.     Case 7
  60.       codigo = &2077
  61.     Case 8
  62.       codigo = &2078
  63.     Case 9
  64.       codigo = &2079
  65.  
  66.   Return codigo
  67.  
  68.  
  69. ' Public Sub DevolverSuperIndice2(valor As Integer) As Integer
  70. '  'Esto no va a funcionar
  71. '   Return Choose(valor, Null, 178, 179, &2074, &2075, &2076, &2077, &2078, &2079)
  72. '
  73. ' End



Salida:
Cita:100 = 2²*5²*1

No existe un exponente "1", si fuera dos como único factor primo. Hubiera salido 21...mejor 2*1
Eso en el caso del Select, que como veis no he comprobado que el valor fuera 1. He comenzado desde valor 2 para exponente.

A ver si se puede mejorar. Sobre todo la función que usa Choose.

Tener en cuenta que después de esto, podemos optar por crear otras funciones que nos puedan devolver
el máximo común divisor, el mínimo común múltiplo, etc. Ya sería más de un número. Por eso opté por dividir en varias funciones independientes.
El uso de colecciones me parece interesante para el ejemplo.

Saludos