De tres cifras

Os dejo el problema semanal:

Encuentra todos los números naturales de tres cifras tal que al dividirlos entre 11 obtenemos la suma de los cuadrados de las cifras del número inicial.

Suerte y a por él.

Autor: ^DiAmOnD^

Miguel Ángel Morales Medina. Licenciado en Matemáticas y autor de Gaussianos y de El Aleph. Puedes seguirme en Twitter o indicar que te gusta mi página de Facebook.

28 Comentarios

  1. Un rango pequeño de numeros naturales y con operaciones básicas (entre naturales), mientras recuerdo lo básico programando en python era demasiado tentador. Si me acuerdo, cuando no este tan dormido, lo intento pensar.

    #!/usr/bin/python
    for i in range(100,999):
    x = i/11
    n = i
    s = 0
    while n > 0:
    s += (n % 10)**2
    n = n / 10
    if s == x and i % 11 == 0:
    print i

    PD: Se filtran los espacios al principio de las lineas y como el código python depende de estos espacios si no se ponen a mano no funcionará.

    Publica una respuesta
  2. #include
    using namespace std;

    int sumaSqr(int x) {
    int c1 = x%10;
    int c2 = (x/10)%10;
    int c3 = x/100;

    return c1*c1 + c2*c2 + c3*c3;
    }

    int main() {
    for (int i = 100; i < 1000; ++i) {
    if (i/11 == sumaSqr(i)) cout << i << endl;
    }
    }

    Resultado:
    131
    241
    324
    550
    624
    803
    900
    910

    Publica una respuesta
  3. Como son pocos números, he preferido mirarlos a mano.
    550
    803

    Los otros que da Juanjo no son divisibles entre 11, y por tanto no sirven: al dividirlos entre 11 se obtiene un número no entero que no puede ser suma de los cuadrados de las cifras de ningún número.

    Publica una respuesta
  4. He hecho un miniprogramita con C# para calcular el resultado.

    static void Main(string[] args)
    {
    int x, y, z;
    for (int i = 100; i <= 999; i++)
    {
    if (i % 11 == 0) // si és múltiple per 11
    {
    x = i / 100;
    y = (i – x * 100) / 10;
    z = i – (x * 100 + y * 10);

    if ((i / 11) == (Math.Pow(x,2) + Math.Pow(y,2) + Math.Pow(z,2)))
    {
    System.Console.Out.WriteLine(“Resultat: ” + i);
    }
    }
    }
    Console.ReadLine();
    }

    El resultado es que únicamente hay dos posibles resultados, 550 y 803.

    Publica una respuesta
  5. ¿Ampliamos el problema a buscar números tales que, al dividirlos entre “alguna” potencia de 11, obtenemos la suma de los cuadrados del número inicial? Así, creo que los informáticos se divertirán más.

    Publica una respuesta
  6. Hombre, quieres todos los números que cumplan esta condición¿? Bufff. No habría problema en programarlo, de hecho creo que sería igual de fácil que lo anterior, pero en vez de un bucle yo pondría otro.
    Lo que yo veo es que al no tener limites superiores esto puede no terminar nunca. Habría que limitar el rango, 4 cifras, 5 cifras, …

    Publica una respuesta
  7. En realidad el rango lo dan las condiciones matemáticas del problema, por ejemplo, para los números que, al dividirlos entre 121 (la segunda potencia de 11) se obtiene la suma de los cuadrados del número inicial se tiene 4114 (34·121, 4²+1²+1²+4²=34) y 22869 (189·121, 2²+2²+8²+6²+9²=189). No hay que mirar más allá de 99999, porque 9²·5·121 (9²·5 es la suma de las cifras de 99999) es igual a 49005, mucho menor que 99999. De hecho, se puede acotar a:
    49999 -> (4²+4·9²)·121 = 41140 < 41999 (4²+1²+3·9²)·121 = 31460 < 31999 (3²+1²+3·9²)·121 = 30613 < 30999 < 31999
    Se puede seguir bajando la cota, pero la del máximo múltiplo de 121 menor que 30999 puede valer. Este procedimiento que acabo de hacer es fácil de implementar, y reduce el número de operaciones.

    Lo mismo se puede hacer para potencias superiores.

    Publica una respuesta
  8. En el post anterior tenía que poner:

    49999 -> (4²+4·9²)·121 = 41140 (menor que) 41999 (menor que) 49999

    41999 -> (4²+1²+3·9²)·121 = 31460 (menor que) 31999 (menor que) 41999

    31999 -> (3²+1²+3·9²)·121 = 30613 (menor que) 30999 (menor que) 31999

    Se ha debido colar un gazapo o algo…

    Publica una respuesta
  9. Acabo de probarlo pero…. me da lo mismo que antes. Puede que no acabe de entender el problema.

    static void Main(string[] args)
    {
    int x, y, z;
    for (int i = 100; i <= 99999; i++)
    {
    x = i / 100;
    y = (i – x * 100) / 10;
    z = i – (x * 100 + y * 10);

    for (int j = 1; j < 50; j++)
    {
    if (i / Math.Pow(11, j) == (Math.Pow(x, 2) + Math.Pow(y, 2) + Math.Pow(z, 2)))
    {
    Console.Out.WriteLine(“Resultat: ” + i);
    }
    }
    }
    Console.ReadLine();
    }

    Publica una respuesta
  10. Àlex Llaó: me refiero a que primero se prueba con 11, después con 11², después con 11³, etc.

    En el caso de 11, basta con tomar todos los múltiplos de 11 menores que cierta cota.
    1·11=11 ; 1²+1²=2; 2-1=1, no es solución

    50·11=550; 5²+5²+0²=50; 50-50=0, es solución
    51·11=561; 5²+6²+1²=62; 62-51=11, no es solución

    es decir, para todo n entre 1 y C (la cota), calculamos 11n, sumamos los cuadrados de las cifras y restamos el número original, si sale 0 es solución; en otro caso no lo es.

    Si quieres, tomemos como cota 9999=11·909, con 9²+9²+9²+9²=324<909. La suma del cuadrado de sus cifras toma el valor máximo entre los números de cuatro cifras, y aun así es menor que 909, y la diferencia se hace mayor si tomamos números con más cifras. Entonces basta con hacer recorrer n entre 1 y 909.

    En el siguiente paso, en lugar de multiplicar por 11, multiplicamos por 11²=121, con una cota distinta que sea buena, por ejemplo, 99999 y hacemos recorrer n entre 1 y la parte entera de \tfrac{99999}{121} y todo lo demás es análogo.

    En el siguiente, lo mismo pero multiplicando por 11³=1331.

    Y así hasta que nos cansemos. 😉

    Publica una respuesta
  11. Primero: estamos hablando en base 10.

    Segundo: ¿no hay nadie que se atreva a atacar el problema de forma matemática?

    No es una crítica a los procedimientos informáticos, ni mucho menos, simplemente pienso que estaría bien que también resolviéramos el problema con matemáticas, sin programación.

    Publica una respuesta
  12. Ojalá pudiera atacarlo de forma matemática pero…. no se como empezar. Jejeje.

    Publica una respuesta
  13. Primero veremos que un número en base 10 de tres cifras y múltiple de 11 es de la forma 100a+10b+c y además cumple a+c=b  (11)
    Como 0<=a,b,c <= 9 observamos que a+c-b puede ser solamente 0 ó 11
    Así pues si planteamos la ecuación 11(a^2+b^2+c^2)=100a+10b+c y sustituimos por a+c=b y a+c=b+11 obtendremos las soluciones, los cálculos son un poco cochambrosos, porque se debe calcular el discriminante de la ecuación y no se escribir la función raíz cuadrada, no obstante no son demasiado complicados, si alguien los necesita porque no sabe seguir que me lo haga saber.

    Publica una respuesta
  14. Se puede empezar tomando un número cualquiera de tres cifras y estudiar qué tiene que cumplir dicho número para ser divisible entre 11…y hasta ahí puedo leer por ahora :D.

    Publica una respuesta
  15. Vale, ya he visto cómo querías atacarlo, Diamond.

    Vamos a tomar un múltiplo de 11 de forma 11 \cdot (10a+b)=110a+11b=100a+10(a+b)+b

    Si no hay acarreo, las cifras serán a para las centenas, a+b para las decenas y b para las unidades. La suma de los cuadrados de las cifras es:
    a^2+(a+b)^2+b^2=2a^2+2ab+2b^2
    que tenemos que igualar con 10a+b, es decir, tenemos la ecuación
    2a^2+2ab+2b^2=10a+b
    o equivalentemente
    2a^2+(2b-10)a+(2b^2-b)=0
    Veamos cuánto puede valer a en términos de b:
    a=\frac{10-2b \pm \sqrt{100-40b+4b^2-16b^2+8b}}{4}= \frac{5-b \pm \sqrt{25-8b-3b^2}}{2}
    Lo que hay dentro de la raíz debe ser un número positivo, y además, cuadrado perfecto, para lo que nos interesa. Así,
    – si b=0 se tiene \sqrt{25}=5 y por tanto a=\frac{5 \pm 5}{2}. Esto nos da los números 50 (a=5, b=0) y 0 (a=b=0), rechazamos este último porque su producto por 11 no es un número de tres cifras, y nos quedamos con 50.
    – si b=1 se tiene \sqrt{14} que no es entero, por lo que se descarta.
    – si b=2 ya se tiene la raíz de un número negativo, como ocurre para todo b mayor que 2.

    Finalmente, si hay acarreo, las cifras serán a+1 para las centenas, a+b-10 para las decenas y b para las unidades. La suma de los cuadrados de las cifras es
    (a+1)^2+(a+b-10)^2+b^2=a^2+2a+1+a^2+b^2+100+2ab-20a-20b+b^2= 2a^2+(2b-18)a+(2b^2-20b+101) que igualamos con 10a+b. Esto nos da la ecuación
    2a^2+(2b-28)a+(2b^2-21b+101)=0
    de la cual, de nuevo, sacamos a en función de b, que sale (abreviando pasos intermedios)
    a=\frac{14-b \pm \sqrt{-3b^2+14b-6}}{2}
    De nuevo, tenemos que buscar un b tal que \sqrt{-3b^2+14b-6} sea entero para sacar la raíz:
    – si b=0 sale la raíz cuadrada de un número negativo, que claramente no nos vale;
    – si b=1 sale \sqrt{5}
    – si b=2 sale \sqrt{10}
    – si b=3 sale \sqrt{9}=3, por lo que a=\frac{11 \pm 3}{2}. Salen por tanto las posibles soluciones 43 y 73, pero sólo 73 es buena porque al multiplicar 43 por 11 no se produce acarreo, que es lo que habíamos supuesto de antemano.
    – si b=4 sale \sqrt{2}
    – con b>1 vuelven a salir números imaginarios

    Así, las únicas soluciones son 50 \cdot 11=550 y 73 \cdot 11=803. Todo ello, visto de forma matemática, sin trucos. 😉

    Publica una respuesta
  16. En la antepenúltima línea tenía que poner “con b>4 vuelven a salir números imaginarios”.

    Publica una respuesta
  17. En lenguaje C el siguiente da que 550 y 803 son las soluciones, aqui lo envio.

    Gracias

    #include
    main()
    {
    int a=0,b=0,c=0,d=0,numero=0,cont=1;

    clrscr();

    printf(“%s”,”COMPROBACION PROBLEMA DE GAUSSIANOS\n\n”);

    while(cont<=999)

    {
    numero=cont;

    a=numero/100;

    b=numero%100;

    c=b/10;

    d=b%10;

    if(((a*a+c*c+d*d)*11)==numero)
    {
    printf(“EL NUMERO %d CUMPLE LA CONDICION\n”,numero);

    getchar();
    }

    ++cont;
    }

    }

    Publica una respuesta
  18. Del enunciado se deduce que el número n es divisible por 11.

    n = 11 m \qquad n,m \in \mathbb{N}

    Sea dicho número cuyas cifras son a, b y c (asumo base 10):

    n = 100a+10b+c \quad / \quad 0 \leqslant a \leqslant 9, \ 0 \leqslant b \leqslant 9, \ 0 \leqslant c \leqslant 9

    (a+c-b) \  mod \  11 = 0
    (a+c) \  mod \  11 = b \  mod \  11

    Entonces

    \frac{n} {11} = m = a^2+b^2+c^2

    Como n es de 3 cifras:

    n \leqslant 999

    11m \leqslant 999

    m \leqslant \frac{999}{11}

    m \leqslant 9

    a^2+b^2+c^2 \leqslant 9

    Publica una respuesta
  19. Mi solución escrita en Ruby:

    (100…1000).each { |i|
    puts i if (i/100)**2 + (i/10%10)**2 + (i%10)**2 == i/11
    }

    Me da los mismos resultados que a Juanjo:
    131
    241
    324
    550
    624
    803
    900
    910

    Un saludo.

    Publica una respuesta
  20. La complicación que planteo “otro”, buscando tambien los divididos por potencias de 11, en codigo Ruby (solo busca hasta potencias de 5 y hasta numero de 5 digitos):

    (100…100000).each { |i|
    p=0
    puts “#{i},#{p}” if p=[i/11,i/11**2,i/11**3,i/11**4,i/11**5].index((i/100000)**2+(i/10000%10)**2+(i/1000%10)**2+(i/100%10)**2++(i/10%10)**2+(i%10)**2)
    }

    Algunos resultados (hay muchas coincidencias). El numero buscado, separado, por una coma, por la potencia de 11:

    910,0
    1195,0
    1202,1
    1212,1
    1221,1
    1300,1
    1696,0
    10112,2
    10121,2
    72010,2
    72100,2

    Publica una respuesta
  21. He cometido un error en ambos codigos, los numeros se dividen por 11 (o potencia) pero se redondea erroneamente el resultado a un entero

    Para el problema original, el codigo correcto es:

    (100…1000).each { |i|
    puts i if (i/100)**2 + (i/10%10)**2 + (i%10)**2 == i.to_f/11
    }

    y solo da dos resultados 550 y 803

    Para el de potencias voy a rehacer un poco el codigo

    Publica una respuesta
  22. Una solución escrita en Haskell:

    import Data.Char
    deTresCifras :: [Int]
    deTresCifras = filter (\n -> sumaCuadradosCifras n == div n 11) [110,121..999]
    where
    sumaCuadradosCifras = (sum.map(^2).cifras)
    cifras = map digitToInt.show

    Publica una respuesta
  23. Lastima que aun no tengamos una solucion matematica aceptable, bueno con respecto a usar computadoras para ayudarnos ha resolver problema con estos. La computadora solo nos da una cierta intuicion para ver patrones o relaciones que nos puedan ayudar con la resolucion de problemas. El problema del uso de la computadoras es que simplemente manejan un numero finito de numeros. Pero hay problema en los cuales la computadoras se quedan cortas, como para la infinitud de los numeros primos, creen que estaremos con un loop infinito para saber si los numeros primos son infinitos o no? creo que antes la computadora se volveria loca porque nunca llegaria ha darnos un resultado. Ojo que la computadora ayuda, pero no resuelve problemas.
    En los proximos dias subire mi solucion, ahora estoy algo ocupado con mis examenes.
    Nota: Este problema fue el primer problema del examen IMO 1960.

    Publica una respuesta
  24. Llegué a la misma solución que / otro , del 14 de abril / solo que me equivoqué al operar y solo me daba 550 xDD

    Creo que la informática es una excelente herramienta, pero sólo eso, una herramienta , donde esté un razonamiento matemático…. !

    Publica una respuesta

Trackbacks/Pingbacks

  1. Bitacoras.com - Información Bitacoras.com... Valora en Bitacoras.com: Os dejo el problema semanal: Encuentra todos los números naturales de tres cifras tal…

Puedes utilizar código LaTeX para insertar fórmulas en los comentarios. Sólo tienes que escribir
[latex]código-latex-que-quieras-insertar[/latex]
o
$latex código-latex-que-quieras-insertar$.

Si tienes alguna duda sobre cómo escribir algún símbolo puede ayudarte la Wikipedia.

Y si los símbolos < y > te dan problemas al escribir en LaTeX te recomiendo que uses los códigos html & lt; y & gt; (sin los espacios) respectivamente.

Envía un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *