A veces, cuando intento ociosamente factorizar cualquier número que aparezca delante de mí¹, después de un tiempo me doy cuenta de que es más fácil de lo que pensaba. Tomemos 2156
por ejemplo: eventualmente se me ocurre que ambos 21
y 56
son múltiplos de 7
, y ciertamente 2156 = 21 x 100 + 56
también es un múltiplo de 7
.
Su tarea es escribir un código que identifique números que sean más fáciles de factorizar debido a una coincidencia de este tipo.
Más precisamente:
Escriba un programa o función que tome un número entero positivo n
como entrada y devuelva un valor verdadero si existe un divisor d
(mayor que 1
) tal que n
pueda cortarse en dos para obtener dos números enteros positivos, cada uno de los cuales es un múltiplo de d
; devuelve un valor falso si no.
- "Picado en dos" significa lo que piensas: la representación habitual de base 10 de
n
particionado en algún momento en una mitad frontal y una mitad posterior para producir otros dos enteros de base 10. Está bien si el segundo entero tiene un cero a la izquierda (pero tenga en cuenta que debe ser un entero positivo, por lo que dividirse1230
en123
y0
no es válido). - Los valores de verdad y falsedad pueden depender de la entrada. Por ejemplo, si cualquier número entero distinto de cero es verdadero en el idioma de su elección, puede devolver el divisor
d
o una de las "piezas" den
(o enn
sí mismo). - Por ejemplo, cualquier número par con al menos dos dígitos en el conjunto
{2, 4, 6, 8}
arrojará un valor verdadero: simplemente divídalo después del primer dígito par. También, por ejemplo, cualquier número primon
arrojará un valor falso, al igual que cualquier número de un dígito. - Tenga en cuenta que es suficiente considerar divisores primos
d
. - Puede suponer que la entrada es válida (es decir, un entero positivo).
Este es el código de golf , por lo que gana el código más corto en bytes. Pero las soluciones en todos los idiomas son bienvenidas, por lo que podemos luchar por el código más corto en cada idioma, no solo el código más corto en general.
Casos de prueba
(Solo tiene que generar un valor verdadero o falso; las anotaciones a continuación son solo a modo de explicación). Algunas entradas que producen valores verdaderos son:
39 (3 divides both 3 and 9)
64 (2 divides both 6 and 4)
497 (7 divides both 49 and 7)
990 (splitting into 99 and 0 is invalid; but 9 divides both 9 and 90)
2233 (11 divides both 22 and 33)
9156 (3 divides both 9 and 156; or, 7 divides both 91 and 56)
11791 (13 divides both 117 and 91)
91015 (5 divides both 910 and 15)
1912496621 (23 divides both 1912496 and 621; some splittings are multiples of 7 as well)
9372679892 (2473 divides both 937267 and 9892; some splittings are multiples of 2 as well)
Algunas entradas que producen valores falsos son:
52
61
130 (note that 13 and 0 is not a valid splitting)
691
899
2397
9029
26315
77300 (neither 7730 and 0 nor 773 and 00 are valid splittings)
2242593803
¹ sí, realmente hago esto