Description du défi
Pour chaque entier positif, n
il existe un nombre dont la forme 111...10...000
est divisible par, n
c'est- à- dire un nombre décimal qui commence par tous 1
et se termine par tous 0
. Ceci est très facile à prouver: si nous prenons un ensemble de n+1
nombres différents sous la forme de 111...111
(tous 1
), alors au moins deux d'entre eux donneront le même reste après division par n
(selon le principe du pigeonhole). La différence de ces deux nombres sera divisible par n
et aura la forme souhaitée. Votre objectif est d'écrire un programme qui trouve ce numéro.
Description d'entrée
Un entier positif.
Description de la sortie
Un nombre p
sous la forme de 111...10...000
, tel que p ≡ 0 (mod n)
. Si vous en trouvez plusieurs, affichez-en un (il n'est pas nécessaire que ce soit le plus petit).
Remarques
Votre programme doit donner la réponse dans un délai raisonnable. Ce qui signifie que le forçage brutal n'est pas autorisé:
p = 0
while (p != 11..10.00 and p % n != 0)
p++
Ce n'est pas non plus:
do
p = random_int()
while (p != 11..10.00 and p % n != 0)
L'itération à travers les nombres sous forme de 11..10..00
est autorisée.
Votre programme n'a pas besoin de gérer une entrée arbitrairement grande - la limite supérieure correspond à la limite supérieure de votre langue.
Exemples de sorties
2: 10
3: 1110
12: 11100
49: 1111111111111111111111111111111111111111110
102: 1111111111111111111111111111111111111111111111110
la source
1
et au moins un0
, sinon0
c'est une solution pour n'importe quelle entrée. (Ce serait bien de clarifier cela cependant.)1
devrait fonctionner.Réponses:
Mathematica, 29 octets
Code de Martin Büttner .
En entrée
n
, cela renvoie le nombre avec des9*ϕ(n)
uns suivis den
zéros, oùϕ
est la fonction de totient d'Euler . Avec une fonctionphi
, cela pourrait être exprimé en Python commeIl suffirait d'utiliser la factorielle à la
n!
place deϕ(n)
, mais en imprimant que beaucoup n'ont pas un temps d'exécution raisonnable.Affirmation:
9*ϕ(n)
ceux suivis den
zéros est un multiple den
.Preuve: Tout d' abord, prouvent le cas qui
n
est pas un multiple de2
,3
ou5
. Nous allons montrer que le nombre composé deϕ(n)
uns est un multiple de `n.Le nombre de
k
uns est égal à(10^k-1)/9
. Puisquen
n'est pas un multiple de3
, c'est un multiple den
tant que10^k-1
est un facteur den
, ou de manière équivalente si10^k = 1 (mod n)
. Notez que cette formulation fait apparaître que sik
fonctionne pour le nombre de uns, il en va de même pour tout multiple dek
.Donc, nous cherchons
k
à être un multiple de l' ordre dek
dans le groupe multiplicatif modulo n . Selon le théorème de Lagrange , un tel ordre est un diviseur de la taille du groupe. Puisque les éléments du groupe sont le nombre de1
àn
qui sont relativement premiers àn
, sa taille est la fonction de totient d'Eulerϕ(n)
. Donc, nous l'avons montré10^ϕ(n) = 1 (mod n)
, et donc le nombre composé deϕ(n)
un est un multiple de `n.Maintenant, traitons les facteurs potentiels de
3
inn
. Nous savons que10^ϕ(n)-1
c'est un multiple den
, mais(10^ϕ(n)-1)/9
peut-être pas. Mais,(10^(9*ϕ(n))-1)/9
est un multiple de9
car il est constitué de9*ϕ(n)
uns, donc la somme de ses chiffres est un multiple de9
. Et nous avons noté que la multiplication de l'exposantk
par une constante préserve la divisibilité.Maintenant, si
n
a des facteurs de2
'et5
', nous devons ajouter des zéros à la fin de la sortie. Il est plus que suffisant d'utiliser desn
zéros (en fait, celog_2(n)
serait le cas). Donc, si notre entréen
est divisée enn = 2^a * 5^b * m
, il suffit d'en avoir9*ϕ(m)
pour être un multiple den
, multiplié par10^n
pour être un multiple de2^a * 5^b
. Et, puisqu'iln
s'agit d'un multiple dem
, il suffit d'en utiliser9*ϕ(n)
. Donc, cela fonctionne pour avoir9*ϕ(n)
ceux suivis den
zéros.la source
EulerPhi
fonction intégrée. Il n'y a rien de stupéfiant à la mise en œuvre réelle, donc je considérerais cela pleinement son propre travail.Python 2, 44 octets
Quand
j
est une puissance de 10 telle que 1000, la division au solj/9
donne un nombre composé de 1 comme 111. Donc,j/9*j
donne 1 suivi d'un nombre égal de 0 comme 111000.La fonction teste récursivement les nombres de cette forme, essayant des puissances de plus en plus élevées de 10 jusqu'à ce que nous trouvions celui qui est un multiple du nombre souhaité.
la source
Pyth, 11 octets
Suite de tests
Fondamentalement, il met simplement un 1 devant et un 0 dans le dos encore et encore jusqu'à ce que le nombre soit divisible par l'entrée.
Explication:
la source
Haskell, 51 octets
En utilisant l'approche de xnor. nimi a enregistré un octet!
la source
CJam,
282519 octetsSauvegardé 6 octets avec l'observation de xnor que nous avons seulement besoin de regarder les numéros du formulaire .
1n0n
Testez-le ici.
Explication
la source
Mathematica,
14055 octetsBeaucoup d'octets supprimés grâce à l'astuce xnor 1 ^ n0 ^ n.
Valeur minimale,
140156 octets Cela donne la solution la plus petite possible.Il calcule le nombre de zéros requis, puis vérifie tous les
1
décomptes possibles jusqu'à ce que cela fonctionne. Il peut sortir un nombre sans 0 mais cela peut être corrigé en ajoutant un<>"0"
droit avant la finale&
.la source
Haskell, 37 octets
Cela utilise le fait que cela fonctionne pour en avoir
9*phi(n)
, oùphi
est la fonction de totaux d'Euler. Ici, il est implémenté en utilisantgcd
et en filtrant, produisant un chiffre pour chaque valeuri
qui est relativement première pour lui qui est dans la plage1
et9*n
. Il suffit également d'utiliser autant de zéros.la source
JavaScript (ES6), 65 octets
Modifier 2 octets enregistrés thx @Neil
Il fonctionne dans les limites du type numérique javascript, avec 17 chiffres significatifs. (Donc assez limité)
Moins golfé
la source
for(m=n;
?for(m=n;!m[16];)if(!((m+=0)%a))
.Perl 5, 26 octets
comprend un octet pour
-n
(-M5.01
est gratuit)la source
Sauge, 33 octets
Cela utilise la méthode de xnor pour produire la sortie.
Essayez-le en ligne
la source
bc, 58 octets
Exemples de résultats
la source
dc, 27 octets
Ceci définit une fonction
f
qui attend son argument dans la variablen
. Pour l'utiliser comme programme,?sn lfx p
pour lire depuis stdin, appelez la fonction et imprimez le résultat sur stdout. La variablem
et le haut de la pile doivent être réinitialisés à 10 (en répétantOdsm
) avant def
pouvoir être réutilisés.Résultats:
la source