Hace unas semanas se publicó en Twitter la siguiente curiosidad:
Al resolverla he tenido la idea de buscar situaciones semejantes que se puedan resolver con hoja de cálculo, que es lo nuestro, o con PARI, que permite más velocidad en las búsquedas. Para ello necesitaré la función TROZOCIFRAS, que extrae un grupo de cifras de la expresión decimal de un número. Deberá tener tres parámetros. Así, TROZOCIFRAS(m;n;p) extraerá en las cifras del número m aquellas que comienzan en el número de orden n y terminen en p. Por ejemplo, TROZOCIFRAS(28732;2;4)=873. Hay que advertir que se cuentan las cifras de derecha a izquierda. Así, TROZOCIFRAS(876253;1;5)=76253.
Esta función necesita para su funcionamiento otra, NUMCIFRAS(m), función que nos cuenta las cifras de un número natural. Dejamos los listados de TROZOCIFRAS y NUMCIFRAS para el Anexo de esta entrada. Hemos suprimido, por brevedad, la condición de que m sea natural. Puedes copiarlos en la sección de funciones y macros de tu hoja de cálculo.
Con estas dos funciones, la condición del acertijo se expresaría como
If Sqr(trozocifras(m;2;3))+trozocifras(m;1;1)=sqr(m) then print(m)
Lo aplicamos a números de tres cifras, para no tener que añadir más condiciones, y al recorrer desde 100 hasta 999 aparece la solución, 169, que cumple que RAIZ(169)=RAIZ(16)+9=4+9=13
Podemos escribir:
For m=100 to 999
If Sqr(trozocifras(m;2;3))+trozocifras(m;1;1)=sqr(m) then print(m)
Next m
Prueba algo similar con cuatro cifras. Si las descompones en grupos de dos, no existe ninguna propiedad similar, es decir:
Tampoco parece existir solución para
Hay más posibilidades y con mayor número de cifras. Lo dejamos abierto.
En el lenguaje PARI la función TROZOCIFRAS queda como
cutdigit(a, p, q)=(a%10^q)\10^(p-1)
y la búsqueda
cutdigit(a, p, q)=(a%10^q)\10^(p-1)
for(n=100, 999, if(sqrt(cutdigit(n, 2, 3))+cutdigit(n, 1, 1)==sqrt(n), print(n)))
Comprobamos que encuentra el 169
Otra adivinanza
¿Existe algún número de tres cifras ABC que cumpla que ABC=AB*C+A*BC?
Si no deseas ver la solución, no sigas leyendo e intenta tú una búsqueda.
Bastará complicar un poco las condiciones anteriores, por ejemplo, así:
For m=100 to 999
If trozocifras(m;2;3)*trozocifras(m;1;1)+trozocifras(m;3;3)*trozocifras(m;1;2)=m then print(m)
Next m
Hemos encontrado así la solución única, que resulta ser 655, ya que 65*5+6*55=325+330=655. Puedes intentarlo con PARI.
Juego de las matrículas
En este invierno, Joseángel Murcia, @tocamates propuso en Twitter un juego de encontrar en nuestros paseos matrículas españolas (cuatro dígitos) en los que los dos últimos formaran el producto de los dos primeros. La cuestión era más lúdica que matemática, pero con nuestra función TROZOCIFRAS se puede conseguir un listado. Basta plantear la condición
For m=1000 to 9999
If trozocifras(m;1;2)=trozocifras(m;4;4)*trozocifras(m;3;3) then print(m)
Next m
Estos son, por ejemplo, los que comienzan en 3 y cumplen la condición:
Evidentemente, esto no tiene más valor que el de un ejemplo trivial.
Menos trivial es preguntar si una matrícula ABCD cumple que (AB)^2+(CD)^2=ABCD.
La respuesta es que existen dos soluciones, 1233=12^2+33^2 y 8833=88^2+33^2. Lo puedes comprobar con la condición
If trozocifras(m;3; 4) ^ 2 + trozocifras(m; 1; 2) ^ 2 = m Then print m
Un trozo múltiplo de otro
A veces las búsquedas de este tipo se deben acotar un poco para evitar resultados triviales. Proponemos otro ejemplo:
¿En cuántos números de tres cifras ABC se cumple que AB es múltiplo de BC?
En esta propuesta, si nos limitamos a lo que se pide, nos resultan demasiados casos, con lo que pierden interés:
Se observa que resultan casos triviales en los que B=0, lo que facilita que se cumpla la condición, o aquellos, como el 333, en el que AB=BC, con lo que es múltiplo trivialmente. Buscaremos de nuevo, pero exigiendo que BC sea mayor que 9, para evitar el cero central, y que AB<>BC. De esta forma obtenemos un resultado más restringido.
421, 517, 526, 724, 842, 913, 923, 931, 947
Es curioso que todos presentan cifras distintas.
Anexo
Public Function numcifras(n)
'Calcula el número de cifras enteras de un número natural. Si no lo es, devuelve un cero
Dim nn, a
a = 1: nn = 0
While a <= n
a = a * 10: nn = nn + 1
Wend
numcifras = nn
Else
numcifras = 0
End Function
Public Function trozocifras(m, n, p)
‘Extrae cifras de m desde el orden n (por la derecha) hasta el orden p. Si no es lógico devuelve -1
Dim a, b, c, d
c = numcifras(m)
If n > c Or p > c Then
trozocifras = -1
Else
a = 10 ^ p
d = 10 ^ (n - 1)
b = m - Int(m / a) * a
b = Int(b / d)
trozocifras = b
End If
Else
trozocifras = -1
End Function