Menu Close

Números cuyas cifras coinciden con las de sus factores primos

Un número n es especial si al unir las cifras de sus factores primos, se obtienen exactamente las cifras de n, aunque puede ser en otro orden. Por ejemplo, 1255 es especial, pues los factores primos de 1255 son 5 y 251.

Definir la función

   esEspecial :: Integer -> Bool

tal que (esEspecial n) se verifica si un número n es especial. Por ejemplo,

   esEspecial 1255 == True
   esEspecial 125  == False

Comprobar con QuickCheck que todo número primo es especial.

Calcular los 5 primeros números especiales que no son primos.

Soluciones

import Data.List (nub, sort)
import Data.Numbers.Primes (isPrime, primeFactors)
import Test.QuickCheck
 
esEspecial :: Integer -> Bool
esEspecial n = 
    sort (show n) == sort (concatMap show (nub (primeFactors n)))
 
-- La propiedad es
prop_primos:: Integer -> Property
prop_primos n = 
    isPrime (abs n) ==> esEspecial (abs n)
 
-- La comprobación es
--    ghci> quickCheck prop_primos
--    +++ OK, passed 100 tests.
 
-- El cálculo es
--    ghci> take 5 [n | n <- [2..], esEspecial n, not (isPrime n)]
--    [735,1255,3792,7236,11913]
Inicial

2 soluciones de “Números cuyas cifras coinciden con las de sus factores primos

  1. Eduardo Román Lemos
     
    import Data.List(sort)
    import Data.Numbers.Primes(primeFactors,isPrime)
    import Test.QuickCheck
     
    esEspecial :: Integer -> Bool
    esEspecial x = sort(digitos x) == sort(digDivisores x)
     
     
    digitos :: Integer -> [Integer]
    digitos x = [read[n]|n <- show x]
     
    digDivisores :: Integer -> [Integer]
    digDivisores x = concat [digitos n|n <- primeFactors x]
     
    --Definimos la propiedad de que todo primo es especial:
    prop_especiales :: Integer -> Property
    prop_especiales x = isPrime x ==> esEspecial x
     
    -- La comprobación es:
    -- ghci> quickCheck prop_especiales
    --    +++ OK, passed 100 tests.
     
    -- Los 5 primeros especiales no primos se calculan con:
    -- ghci> take 5 [x|x<-[4..],esEspecial x,not(isPrime x)]
    -- [1255,12955,17482,25105,100255]
  2. M Miranda
    import Data.List (sort)
    import Data.Numbers.Primes(primeFactors,isPrime)
    import Test.QuickCheck
     
    esEspecial :: Integer -> Bool
    esEspecial n = sort xs == sort ys
                 where xs = show n
                       ys = concat[show x|x<-primeFactors n]
     
    prop_especial :: Integer -> Property
    prop_especial n = isPrime n ==> esEspecial n
     
    -- Los 5 primeros numeros especiales que no son primos se calculan: --
    -- take 5 [x|x<-[1..],esEspecial x, not(isPrime x)] == [1255,12955,17482,25105,100255] --

Escribe tu solución

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.