Comunidad Gambas-es
Descomponer en factores primos - Versión para impresión

+- Comunidad Gambas-es (https://gambas-es.org)
+-- Foro: Gambas (https://gambas-es.org/forum-3.html)
+--- Foro: General (https://gambas-es.org/forum-4.html)
+--- Tema: Descomponer en factores primos (/thread-801.html)



Descomponer en factores primos - Shell - 07-01-2022

Buenas!.

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

Código:
Public Sub Main()

  MostrarDescompFact(100)

End

Public Sub MostrarDescompFact(numero As Integer)''Mostrar descomposición factorial

  Dim valor As String
  Dim cfactores As New Collection

  cfactores = Descomponer(numero)

  Print numero; " = ";
  For Each valor In cfactores
    Print cfactores.key; String.Chr(DevolverSuperIndice(valor)); "*";
  Next
  Print 1

End

Public Sub Descomponer(numero As Integer) As Collection ''Descomponer un números en factores

  Dim n As Integer
  Dim factores As New Collection

  n = 2

  While n <= numero
    If numero Mod n = 0 Then
      numero = numero / n
      If Not factores.Exist(n) Then
        factores.Add(1, n)
      Else
        factores[n] += 1
      Endif
    Else
      n += 1
    Endif
  Wend

  Return factores

End

Public Function DevolverSuperIndice(valor As Integer) As Integer ''Devuelve el carácter unicode de exponente

  Dim codigo As Integer

  'De esta forma se ve mejor que usando Choose
  'El valor 1 no es posible como exponente
  Select Case valor
    Case 2
      codigo = 178
    Case 3
      codigo = 179
    Case 4
      codigo = &2074
    Case 5
      codigo = &2075
    Case 6
      codigo = &2076
    Case 7
      codigo = &2077
    Case 8
      codigo = &2078
    Case 9
      codigo = &2079
  End Select

  Return codigo

End

' Public Sub DevolverSuperIndice2(valor As Integer) As Integer
'  'Esto no va a funcionar
'   Return Choose(valor, Null, 178, 179, &2074, &2075, &2076, &2077, &2078, &2079)
'
' 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