Menu Close

Múltiplos con ceros y unos

Se observa que todos los primeros números naturales tienen al menos un múltiplo no nulo que está formado solamente por ceros y unos. Por ejemplo, 1×10=10, 2×5=10, 3×37=111, 4×25=100, 5×2=10, 6×185=1110; 7×143=1001; 8X125=1000; 9×12345679=111111111.

Definir la función

   multiplosCon1y0 :: Integer -> [Integer]

tal que (multiplosCon1y0 n) es la lista de los múltiplos de n cuyos dígitos son 1 ó 0. Por ejemplo,

   take 4 (multiplosCon1y0 3)      ==  [111,1011,1101,1110]
   take 3 (multiplosCon1y0 23)     ==  [110101,1011011,1101010]
   head (multiplosCon1y0 1234658)  ==  110101101101000000110

Comprobar con QuickCheck que todo entero positivo tiene algún múltiplo cuyos dígitos son 1 ó 0.

Soluciones

import Test.QuickCheck
 
-- 1ª definición
-- =============
 
multiplosCon1y0 :: Integer -> [Integer]
multiplosCon1y0 n = [x | x <- multiplos n
                       , todos1y0 x]
 
-- (multiplos n) es la lista de los múltiplos de n. Por ejemplo, 
--    take 12 (multiplos 5)  ==  [5,10,15,20,25,30,35,40,45,50,55,60]
multiplos :: Integer -> [Integer]
multiplos n = [n,2*n..]
 
-- (todos1y0 n) se verifica si todos los dígitos de n son el 1 o el
-- 0. Por ejmplo,
--    todos1y0 1101110  ==  True
--    todos1y0 1102110  ==  False
todos1y0 :: Integer -> Bool
todos1y0 n = all (`elem` "01") (show n)
 
-- 2ª definición
-- =============
 
multiplosCon1y0b :: Integer -> [Integer] 
multiplosCon1y0b n = 
    [x | x <- numerosCon1y0
       , x `rem` n == 0] 
 
-- numerosCon1y0 es la lista de los números cuyos dígitos son 1 ó 0. Por
-- ejemplo,  
--    ghci> take 15 numerosCon1y0
--    [1,10,11,100,101,110,111,1000,1001,1010,1011,1100,1101,1110,1111]
numerosCon1y0 :: [Integer]
numerosCon1y0 = 1 : concat [[10*x,10*x+1] | x <- numerosCon1y0]
 
-- Comparación de eficiencia
-- =========================
 
--    λ> head (multiplosCon1y0 9)
--    111111111
--    (7.70 secs, 10,853,320,456 bytes)
--    λ> head (multiplosCon1y0b 9)
--    111111111
--    (0.01 secs, 167,992 bytes)
 
-- Comprobación de la propiedad
-- ============================
 
-- La propiedad es
prop_existe_multiplosCon1y0 :: Integer -> Property
prop_existe_multiplosCon1y0 n = 
    n > 0 ==> (not . null) (multiplosCon1y0b n)
 
-- La comprobación es
--    λ> quickCheck prop_existe_multiplosCon1y0
--    +++ OK, passed 100 tests.

Pensamiento

Huye del triste amor, amor pacato,
sin peligro, sin venda ni aventura,
que espera del amor prenda segura,
porque en amor locura es lo sensato.

Antonio Machado

Avanzado

3 soluciones de “Múltiplos con ceros y unos

  1. claniecas
    multiplosCon1y0 :: Integer -> [Integer]
    multiplosCon1y0 n = [x | x <- multiplos n, maximum (separa x) == 1]
     
    multiplos :: Integer -> [Integer]
    multiplos n = [n*x | x <- [1..]]
     
    separa :: Integer -> [Integer]
    separa n | n < 10    = [n]
             | otherwise = separa (div n 10) ++ [mod n 10]
  2. Fernando Carreño Navas
    multiplosCon1y0 :: Integer -> [Integer]
    multiplosCon1y0 n = [x | x <- multiplos n , unoycero x]
     
    multiplos :: Integer -> [Integer]
    multiplos n = iterate (+n) n
     
    unoycero :: Integer -> Bool
    unoycero 0 = True
    unoycero n | mod n 10 /= 0, mod n 10 /= 1 = False
    unoycero n = unoycero (div n 10)
  3. rebgongor

    Haciendo uso de la definición de Fernando de “unoycero”.

    multiplosCon1y0 :: Integer -> [Integer]
    multiplosCon1y0 n = filter (esNumeroCon1y0) (multiplos n)
     
    multiplos :: Integer -> [Integer]
    multiplos n = iterate (+n) n
     
    esNumeroCon1y0 :: Integer -> Bool
    esNumeroCon1y0 0 = True
    esNumeroCon1y0 n | mod n 10 /= 0, mod n 10 /= 1 = False
    esNumeroCon1y0 n = esNumeroCon1y0 (div n 10)
     
    prop_multiplosCon1y0 :: Integer -> Property
    prop_multiplosCon1y0 n = n > 0 ==> multiplosCon1y0 n /= []

    La propiedad no sé si es correcta porque no sale si pasa las pruebas ni da un contraejemplo, simplemente para de cargar pasado un tiempo.

Escribe tu solución

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