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.
¿Te ha gustado la entrada? Puedes invitarme a un café, Gauss te lo agradecerá 😉
Información Bitacoras.com…
Valora en Bitacoras.com: 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….
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á.
#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
¿En qué base estamos hablando?
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.
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.
¿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.
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, …
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… Lee más »
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…
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();
}
À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… Lee más »
Pues eso hago con el código no?
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.
Ojalá pudiera atacarlo de forma matemática pero…. no se como empezar. Jejeje.
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
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.
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: que tenemos que igualar con , es decir, tenemos la ecuación o equivalentemente Veamos cuánto puede valer en términos de : 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 se tiene y por tanto . Esto nos da los números ()… Lee más »
En la antepenúltima línea tenía que poner «con b>4 vuelven a salir números imaginarios».
Xavier Tapia, la función raíz cuadrada se representa:

\sqrt{x}
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;
}
}
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:
Rectificación:
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.
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
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
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
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… Lee más »
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…. !