De tres cifras
Os dejo el problema semanal:
Encuentra todos los números naturales de tres cifras tal que al dividirlos entre
obtenemos la suma de los cuadrados de las cifras del número inicial.
Suerte y a por él.
Os dejo el problema semanal:
Encuentra todos los números naturales de tres cifras tal que al dividirlos entre
obtenemos la suma de los cuadrados de las cifras del número inicial.
Suerte y a por él.
Comentarios cerrados.
Trackback | 14 Apr, 2009
Bitacoras.com
python | 14 de April de 2009 | 10:54
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á.
Juanjo | 14 de April de 2009 | 11:34
#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
Manuel | 14 de April de 2009 | 11:48
¿En qué base estamos hablando?
otro | 14 de April de 2009 | 11:58
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.
Àlex Llaó | 14 de April de 2009 | 12:18
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.
otro | 14 de April de 2009 | 12:27
¿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.
Àlex Llaó | 14 de April de 2009 | 12:54
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, …
otro | 14 de April de 2009 | 13:10
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.
otro | 14 de April de 2009 | 13:12
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…
Àlex Llaó | 14 de April de 2009 | 13:23
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();
}
otro | 14 de April de 2009 | 14:12
À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
y todo lo demás es análogo.
En el siguiente, lo mismo pero multiplicando por 11³=1331.
Y así hasta que nos cansemos.
Àlex Llaó | 14 de April de 2009 | 14:15
Pues eso hago con el código no?
^DiAmOnD^ | 14 de April de 2009 | 14:26
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.
Àlex Llaó | 14 de April de 2009 | 15:02
Ojalá pudiera atacarlo de forma matemática pero…. no se como empezar. Jejeje.
Xavier Tapia | 14 de April de 2009 | 15:34
Primero veremos que un número en base 10 de tres cifras y múltiple de 11 es de la forma
y además cumple 
<=
<=
observamos que
puede ser solamente
ó 
y sustituimos por
y
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.
Como
Así pues si planteamos la ecuación
^DiAmOnD^ | 14 de April de 2009 | 15:38
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
.
otro | 14 de April de 2009 | 16:03
Vale, ya he visto cómo querías atacarlo, Diamond.
Vamos a tomar un múltiplo de 11 de forma
Si no hay acarreo, las cifras serán
para las centenas,
para las decenas y
para las unidades. La suma de los cuadrados de las cifras es:

, es decir, tenemos la ecuación


en términos de
:

se tiene
y por tanto
. Esto nos da los números
(
) y
(
), rechazamos este último porque su producto por 11 no es un número de tres cifras, y nos quedamos con
.
se tiene
que no es entero, por lo que se descarta.
ya se tiene la raíz de un número negativo, como ocurre para todo
mayor que
.
que tenemos que igualar con
o equivalentemente
Veamos cuánto puede valer
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
- si
- si
Finalmente, si hay acarreo, las cifras serán
para las centenas,
para las decenas y
para las unidades. La suma de los cuadrados de las cifras es
que igualamos con
. Esto nos da la ecuación

en función de
, que sale (abreviando pasos intermedios)

tal que
sea entero para sacar la raíz:
sale la raíz cuadrada de un número negativo, que claramente no nos vale;
sale 
sale 
sale
, por lo que
. Salen por tanto las posibles soluciones
y
, pero sólo
es buena porque al multiplicar
por 11 no se produce acarreo, que es lo que habíamos supuesto de antemano.
sale 
vuelven a salir números imaginarios
de la cual, de nuevo, sacamos
De nuevo, tenemos que buscar un
- si
- si
- si
- si
- si
- con
Así, las únicas soluciones son
y
. Todo ello, visto de forma matemática, sin trucos.
otro | 14 de April de 2009 | 16:05
En la antepenúltima línea tenía que poner “con b>4 vuelven a salir números imaginarios”.
otro | 14 de April de 2009 | 16:09
Xavier Tapia, la función raíz cuadrada se representa:

\sqrt{x}
Jairo Gonzalez | 15 de April de 2009 | 19:13
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;
}
}
Jones, Francisco | 16 de April de 2009 | 08:26
Del enunciado se deduce que el número n es divisible por 11.
Sea dicho número cuyas cifras son a, b y c (asumo base 10):
Entonces
Como n es de 3 cifras:
Jones, Francisco | 16 de April de 2009 | 08:28
Rectificación:
ventolino | 16 de April de 2009 | 17:08
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.
ventolino | 16 de April de 2009 | 19:21
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
ventolino | 16 de April de 2009 | 19:56
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
Jesús | 22 de April de 2009 | 06:40
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
Edgar Marca | 17 de May de 2009 | 07:36
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.
Wolf | 29 de July de 2009 | 11:49
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…. !