Menu Close

Persistencia aditiva

La raíz digital de un número entero positivo n es el dígito resulta al sumar sus dígitos, volviendo a sumar reiteradamente los resultados de esa suma y de las siguientes hasta que la suma sea un número de un dígito, al que se llama la raíz digital del número n y se representa pod D(n). Por ejemplo, la raíz digital del número 23451 es 6, porque 2+3+4+5+1 = 15 y sumando los dígitos del 15 resulta 6.

La persistencia aditiva de un número entero positivo es el número de veces que hay sumar sus dígitos para llegar a su raíz digital. Por ejemplo, la persistencia aditiva de 2718 es 2: primero encontramos que 2+7+1+8 = 18, luego que 1+8 = 9.

Definir la función

   persistencia :: Integer -> Integer

tal que (persistencia n) es la persistencia del número entero positivo n. Por ejemplo,

   persistencia 2718                     ==  2
   persistencia 199                      ==  3
   persistencia 19999999999999999999999  ==  4

Soluciones

import Data.List (genericLength)
import Test.QuickCheck (Property, (==>), quickCheck)
 
-- 1ª solución
-- ===========
 
persistencia :: Integer -> Integer
persistencia n
  | n < 10    = 0
  | otherwise = 1 + persistencia (sumaDigitos n)
 
-- (sumaDigitos n) es la suma de los dígitos de n. Por ejemplo,
--    sumaDigitos 2021  ==  5
sumaDigitos :: Integer -> Integer
sumaDigitos = sum . digitos
 
-- (digitos n) es la lista de los dígitos de n. Por ejemplo,
--    digitos 2021  ==  [2,0,2,1]
digitos :: Integer -> [Integer]
digitos x = [read [c] | c <- show x]
 
-- 2ª solución
-- ===========
 
persistencia2 :: Integer -> Integer
persistencia2 = aux 0
  where aux m n
          | n < 10    = m
          | otherwise = aux (m+1) (sumaDigitos n)
 
-- 3ª solución
-- ===========
 
persistencia3 :: Integer -> Integer
persistencia3 n =
  genericLength (takeWhile (>9) (iterate sumaDigitos n))
 
-- Comprobación de equivalencia
-- ============================
 
-- La propiedad es
prop_equiv :: Integer -> Property
prop_equiv n =
  n > 0 ==>
  all (== (persistencia n))
      [persistencia2 n,
       persistencia3 n]
 
-- La comprobación es
--    λ> quickCheck prop_equiv
--    +++ 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>

4 soluciones de “Persistencia aditiva

  1. Rubén Muñoz Mkrtchian
    persistencia :: Integer -> Integer
    persistencia n = aux 0 n
      where aux k n | n < 10    = k
                    | otherwise = aux (k+1) (sum [read [x] | x <- show n])
  2. ADOLFO ENRIQUE VÁZQUEZ RUIZ
     
    persistencia :: Integer -> Integer
    persistencia n = genericLength ( takeWhile (>=10) ( iterate (sumaDigitos) n))
     
    sumaDigitos :: Integer -> Integer
    sumaDigitos n = sum ( digitos n)
     
    digitos :: Integer -> [Integer]
    digitos n = [read [x] | x <- show n]
  3. Juan María Jiménez Jiménez
    persistencia :: Integer -> Integer
    persistencia n = aux (n,0)
      where aux (n,p) | length(dig n) == 1 = p
                      | otherwise          = aux ((sum (dig n)),p+1)
            dig x = digitosConjunto x
     
    digitosConjunto :: Integer -> [Integer]
    digitosConjunto n = [ read [c] | c<-(show n)]
  4. Juan María Jiménez Jiménez
    persistencia :: Integer -> Integer
    persistencia n = aux (n,0)
      where aux (n,p) | length(dig n) == 1 = p
                      | otherwise          = aux ((sum (dig n)),p+1)
            dig x = digitosConjunto x

Leave a Reply

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