Parfois, lorsque j'essaie paresseusement de prendre en compte le nombre qui apparaît devant moi¹, après un certain temps, je me rends compte que c'est plus facile que je ne le pensais. Prenons 2156
par exemple: il m'est finalement apparu que les deux 21
et 56
sont des multiples de 7
, et donc certainement 2156 = 21 x 100 + 56
aussi un multiple de 7
.
Votre tâche consiste à écrire du code qui identifie les nombres plus faciles à factoriser en raison d'une coïncidence de ce type.
Plus précisément:
Écrivez un programme ou une fonction qui prend n
en entrée un entier positif et renvoie une valeur vraie s'il existe un diviseur d
(supérieur à 1
) tel qu'il n
peut être coupé en deux pour produire deux entiers positifs, chacun étant un multiple de d
; retourner une valeur falsifiée sinon.
- "Coupé en deux" signifie ce que vous pensez: la représentation habituelle en base 10 de
n
partitionnée à un moment donné en une moitié avant et une moitié arrière pour donner deux autres entiers de base 10. Ce n'est pas grave si le deuxième entier a un zéro non significatif (mais notez que ce doit être un entier positif, donc le fractionnement1230
en123
et0
n'est pas valide). - Les valeurs véridiques et fausses peuvent dépendre de l'entrée. Par exemple, si un entier différent de zéro est véridique dans la langue de votre choix, vous pouvez renvoyer le diviseur
d
ou l'un des "morceaux" den
(oun
lui - même d'ailleurs). - Par exemple, tout nombre pair avec au moins deux chiffres dans l'ensemble
{2, 4, 6, 8}
donnera une valeur vraie: il suffit de le diviser après le premier chiffre pair. De même, par exemple, tout nombre premiern
donnera une valeur fausse, tout comme n'importe quel nombre à un chiffre. - Notez qu'il suffit de considérer les diviseurs premiers
d
. - Vous pouvez supposer que l'entrée est valide (c'est-à-dire un entier positif).
Il s'agit de code-golf , donc le code le plus court en octets l'emporte. Mais les solutions dans toutes les langues sont les bienvenues, nous pouvons donc nous efforcer d'obtenir le code le plus court dans chaque langue, et pas seulement le code le plus court dans l'ensemble.
Cas de test
(Vous n'avez qu'à sortir une valeur véridique ou fausse; les annotations ci-dessous sont juste à titre d'explication.) Certaines entrées qui donnent des valeurs véridiques sont:
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)
Certaines entrées qui donnent des valeurs de falsification sont:
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
¹ oui je fais vraiment ça