Às vezes, quando estou ociosamente tentando fatorar qualquer número que aparece na minha frente after, depois de um tempo percebo que é mais fácil do que eu pensava. Tome 2156
por exemplo: que, eventualmente, ocorre-me que tanto 21
e 56
são múltiplos de 7
e assim certamente 2156 = 21 x 100 + 56
também é um múltiplo de 7
.
Sua tarefa é escrever um código que identifique números mais fáceis de fatorar devido a uma coincidência desse tipo.
Mais precisamente:
Escreva um programa ou função que use um número inteiro positivo n
como entrada e retorne um valor verdadeiro se existir um divisor d
(maior que 1
) que n
possa ser dividido em dois para gerar dois números inteiros positivos, cada um dos quais é múltiplo d
; retorne um valor falso se não.
- "Dividido em dois" significa o que você pensa: a representação usual da base 10
n
particionada em algum momento em uma metade da frente e uma metade traseira para produzir dois outros números inteiros da base 10. Tudo bem se o segundo inteiro tem um zero à esquerda (mas nota que ele deve ser um inteiro positivo, então a divisão1230
em123
e0
não é válido). - Os valores de verdade e falsidade podem depender da entrada. Por exemplo, se qualquer número inteiro diferente de zero é verdadeiro no seu idioma de escolha, você pode devolver o divisor
d
ou uma das "partes" den
(oun
ela mesma nesse caso). - Por exemplo, qualquer número par com pelo menos dois dígitos no conjunto
{2, 4, 6, 8}
produzirá um valor verdadeiro: basta dividi-lo após o primeiro dígito par. Também, por exemplo, qualquer número primon
produzirá um valor falso, assim como qualquer número de um dígito. - Observe que basta considerar os divisores principais
d
. - Você pode assumir que a entrada é válida (ou seja, um número inteiro positivo).
Isso é código-golfe , então o código mais curto em bytes vence. Porém, soluções em todos os idiomas são bem-vindas, para que possamos buscar o código mais curto em cada idioma, não apenas o código mais curto em geral.
Casos de teste
(Você só precisa emitir um valor verdadeiro ou falso; as anotações abaixo são apenas uma explicação). Algumas entradas que produzem valores verdadeiros são:
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)
Algumas entradas que geram valores falsos são:
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
¹ sim, eu realmente faço isso