Números con la misma cantidad de anteriores con 1 que sin 1
Una propiedad del número 24 es que entre los números menores o iguales que 24 hay la misma cantidad de números con el dígito 1 que sin el 1; en efecto, los que tienen 1 son
1 |
[1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21] |
y los que no lo tienen son
1 |
[2, 3, 4, 5, 6, 7, 8, 9, 20, 22, 23, 24] |
Diremos que un número es especial si cumple dicha propiedad.
Definir la sucesión
1 |
especiales :: [Integer] |
cuyos elementos son los números especiales. Por ejemplo,
1 |
take 10 especiales == [2,16,24,160,270,272,1456,3398,3418,3420] |
Soluciones
1 2 3 4 5 6 7 |
import Data.List (genericLength) especiales :: [Integer] especiales = [n | n <- [2,4..], especial n] especial :: Integer -> Bool especial n = genericLength [x | x <- [1..n], '1' `elem` show x] == n `div` 2 |
Simplificada y más eficiente:
Salvo error, parece que nºs especiales sólo hay éstos o los siguientes (¿hay más?) son muy grandes (por encima de 10e10):
2,16,24,160,270,272,1456,3398,3418,3420,3422,13120,44686,118096,674934,1062880
En lugar de evaluar uno a uno, se enumeran los rangos de números consecutivos que tienen o no uno (porque en cada rango habrá, como mucho, un único especial; eje. entre 100~~~000 y 199~~~999 sólo puede haber, a lo sumo, un especial, pues el conteo de «sin» está fijo y «con» crece estrictamente).
(Salvo error claro)
Si x(n) es el número de números con 1 desde el 1 hasta 10^n-1 (1..999) es
x(1) = 1
x(n) = 10^(n-1) + 9 x(n-1)
Desarrollando
x(1)= 1
x(2)= 10 + 9
x(3)= 10² + 9 10 + 81
x(4)= 10³ + 9 10² + 81 10 + 729
x(5)= 10⁴ + 9 10³ + 81 10² + 729 10 + 6561
…
x(n) = 10^n – 9^n
Si y(n) es el número de números sin 1 desde 1 hasta 10^n-1 (1..999) es
y(n) = 10^n – 1 – x(n) = 9^n – 1
Como las dos son estrictamente crecientes, en
x(n) – y(n+1)
ya no habrá suficientes «sin 1» para igualar a los «con 1» exactamente para ser
(n-1) ln 10 = n ln 9
es n=21.854, por lo que ya no hay especiales por encima de 10^22.
Es posible obtener todos los especiales hasta
n
en tiempo O(log n) y espacio O(log n) (el código en C está aquí)¡Al fin!, hay tres casos especiales, se revisan de arriba a abajo las potencias de 10 candidatas.