Menu Close

Múltiplos sin ceros

El enunciado de un problema para la IMO (Olimpiada Internacional de Matemáticas) de 1972 es

Demostrar que cada n ≢ 0 (mod 10) posee algún múltiplo sin el dígito 0.

Definir la función

   multiplosSinCeros :: Integer -> [Integer]

tal que (multiplosSinCeros n) es la lista de los múltiplos de n sin el dígito 0. Por ejemplo,

   λ> take 10 (multiplosSinCeros 101)
   [1111,1212,1313,1414,1515,1616,1717,1818,1919,2121]

Comprobar con QuickCheck que si n es un número entero positivo no divisible por 10, entonces n posee algún múltiplo sin el dígito 0.

Soluciones

import Test.QuickCheck (Property(..), (==>), quickCheck)
 
multiplosSinCeros :: Integer -> [Integer]
multiplosSinCeros n =
  filter sinCeros [n,2*n..]
 
sinCeros :: Integer -> Bool
sinCeros n =
  '0' `notElem` show n
 
-- La propiedad es
prop_multiplosSinCeros :: Integer -> Property
prop_multiplosSinCeros n =
  n > 0 && n `mod` 10 /= 0 ==>
  not (null (multiplosSinCeros n))
 
-- La comprobación es
--    λ> quickCheck prop_multiplosSinCeros
--    +++ OK, passed 100 tests.

Nuevas soluciones

  • En los comentarios se pueden escribir nuevas soluciones.
  • El código se debe escribir entre una línea con <pre lang="haskell"> y otra con </pre>

Una solución de “Múltiplos sin ceros

  1. Alejandro García Alcaide
    import Test.QuickCheck 
    -- La funcion que buscamos es: 
    multiplosSinCeros :: Integer -> [Integer]
    multiplosSinCeros n = [x | x <- [n..], mod x n == 0, sinCeros x]
     where sinCeros x = all (/=0) [read[n]::Integer | n <- show x]
     
    -- Comprobamos la propiedad
    propiedad :: Integer -> Property
    propiedad n = n > 0 && mod n 10 /= 0 ==> not (null (multiplosSinCeros n))
     
    -- quickCheck propiedad
    -- +++ OK, passed 100 tests.

Leave a Reply

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