Définition
Un nombre est positif s'il est supérieur à zéro.
Un nombre ( A
) est le diviseur d'un autre nombre ( B
) s'il A
peut se diviser B
sans reste.
Par exemple, 2
est un diviseur de 6
car 2
peut se diviser 6
sans reste.
Objectif
Votre tâche consiste à écrire un programme / une fonction qui prend un nombre positif, puis à trouver tous ses diviseurs.
Restriction
- Vous ne pouvez pas utiliser de fonction intégrée liée à l' amorçage ou à la factorisation .
- La complexité de votre algorithme ne doit pas dépasser O (sqrt (n)) .
Liberté
- La liste de sortie peut contenir des doublons.
- La liste de sortie n'a pas besoin d'être triée.
Notation
C'est du code-golf . La solution la plus courte en octets gagne.
Cas de test
input output
1 1
2 1,2
6 1,2,3,6
9 1,3,9
O(sqrt(n))
.99 (1 3 9 11 33 99)
Réponses:
PostgreSQL, 176 octets
SqlFiddleDemo
Contribution:
(SELECT ...v)
Comment ça fonctionne:
(SELECT ...v)
- contributiongenerate_series(1, sqrt(v)::int)
- nombres de 1 à sqrt (n)WHERE v%r=0
-filtres diviseursSELECT r FROM c UNION SELECT v/r FROM c
reste de diviseurs et combinerSELECT string_agg(r::text,',' ORDER BY r)
produire un résultat final séparé par des virgulesEntrée sous forme de tableau:
SqlFiddleDemo
Production:
la source
C # 6, 75 octets
Basé sur la solution C # de downrep_nation, mais récursif et golfé plus bas en utilisant certaines nouvelles fonctionnalités de C # 6.
L'algorithme de base est le même que celui présenté par downrep_nation. La boucle for est transformée en récursivité, donc le deuxième paramètre. le début de récursivité est effectué par le paramètre par défaut, ainsi la fonction est appelée avec le seul numéro de départ requis.
Comme la plupart des réponses ici (encore) ne suivent pas le format de sortie exact des exemples, je le garde tel quel, mais comme inconvénient, la fonction inclut une seule virgule de fin au résultat.
la source
R ,
3631 octetsEssayez-le en ligne!
-5 octets grâce à Robin Ryder
la source
n^.5
au lieu desqrt(n)
.1
nombreuses fois.Matlab, 48 octets
la source
sqrt(n)
puis place chaque diviseurd
etn/d
dans ma liste.b=~mod(n,a)
pour enregistrer 1 octet?J, 26 octets
Explication
la source
JavaScript (ES6) - 48 octets
Pas très efficace mais fonctionne! Exemple ci-dessous:
la source
MATL , 12 octets
L'approche est similaire à celle de la réponse de @ flawr .
Essayez-le en ligne!
Explication
la source
05AB1E ,
1412 octetsCode:
Explication:
Utilise l' encodage CP-1252 . Essayez-le en ligne! .
la source
Python 2, 64 octets
Cette fonction anonyme génère une liste de diviseurs. Les diviseurs sont calculés par division d'essai d'entiers dans la plage
[1, ceil(sqrt(n))]
, qui estO(sqrt(n))
. Sin % x == 0
(équivalent àn%x<1
), alors les deuxx
etn/x
sont des diviseurs den
.Essayez-le en ligne
la source
Gelée , 9 octets
Comme les autres réponses, c'est O (√n) si nous faisons l'hypothèse (fausse) que la division entière est O (1) .
Comment ça fonctionne
Essayez-le en ligne!
la source
Javascript, 47 octets
la source
Mathematica, 50 octets
Similaire à la solution de @ flawr .
Effectue la division de traînée pour x de 1 jusqu'à la racine carrée de n et si divisible, l'enregistre dans une liste sous les noms x et n / x .
∣
nécessite 3 octets pour représenter en UTF-8, ce qui fait que la chaîne de 48 caractères nécessite 50 octets en représentation UTF-8.Usage
la source
JavaScript (ES6),
6662 octetsJe pensais que j'écrirais une version qui renvoyait une liste dédupliquée triée, et elle s'est avérée en fait 4 octets plus courte ...
la source
C #, 87 octets
Golfé
Non golfé
Code complet
Communiqués
87 bytes
- Solution initiale.Remarques
var
«etint
» au lieu deString
«etInt32
» pour raccourcir le code, tandis que dans le code non golfé et le code complet, j'utiliseString
«etInt32
» pour rendre le code plus lisible.la source
for
généralement mieux quewhile
.for
boucle aurait la même longueur que lawhile
boucle. Dans ce cas, il n'est pas pertinent d'avoir l'un ou l'autre.Lua, 83 octets
Je ne pouvais pas faire mieux, malheureusement
la source
Perl 6 , 40 octets
Explication:
Usage:
la source
c #, 87 octets
je ne sais pas si cela fonctionne pour tous les numéros, je pense que oui.
mais la complexité est bonne, donc c'est déjà quelque chose
la source
Rubis, 56 octets
la source
Code machine IA-32, 27 octets
Hexdump:
Code source (syntaxe MS Visual Studio):
Le premier paramètre (
ecx
) est un pointeur vers la sortie, le deuxième paramètre (edx
) est le nombre. Cela ne marque en aucun cas la fin de la sortie; il faut pré-remplir le tableau de sortie avec des zéros pour trouver la fin de la liste.Un programme C ++ complet qui utilise ce code:
La sortie a quelques problèmes, même si elle suit la spécification (pas besoin de tri; pas besoin d'unicité).
Entrée: 69
Production:
Les diviseurs sont par paires.
Entrée: 100
Production:
Pour des carrés parfaits, le dernier diviseur est émis deux fois (c'est une paire avec lui-même).
Entrée: 30
Production:
Si l'entrée est proche d'un carré parfait, la dernière paire est sortie deux fois. C'est à cause de l'ordre des vérifications dans la boucle: tout d'abord, il vérifie "reste = 0" et les sorties, puis seulement il vérifie que "quotient <diviseur" pour quitter la boucle.
la source
SmileBASIC, 49 octets
Utilise le fait que
D>N/D
=D>sqrt(N)
pour les nombres positifsla source
C,
8781 octetsAmélioré par @ceilingcat , 81 octets:
Essayez-le en ligne!
Ma réponse d'origine, 87 octets:
Compilez avec
gcc div.c -o div -lm
et exécutez avec./div <n>
.Bonus: une variante encore plus courte avec une complexité temporelle O (n) et codée en dur
n
(46 octets + longueur den
):Edit: Merci à @Sriotchilism O'Zaic d'avoir souligné que les entrées ne doivent pas être codées en dur, j'ai modifié la soumission principale pour prendre l'entrée via argv.
la source
n
l'entrée? Placer l'entrée dans une variable n'est pas une manière acceptée de faire l'entrée ici pour un certain nombre de raisons. Vous pouvez en savoir plus sur nos formulaires d'entrée et de sortie acceptés et non acceptés ici: codegolf.meta.stackexchange.com/questions/2447/… . Et si vous êtes curieux au sujet d'une langue spécifique (par exemple C), vous pouvez regarder ici: codegolf.meta.stackexchange.com/questions/11924/… .n
c'est l'entrée. Je vais essayer de le modifier pour qu'il prenne l'entrée d'une autre manière. Merci pour l'info!APL (NARS), 22 caractères, 44 octets
tester:
la source
C # (compilateur interactif Visual C #) , 40 octets
Fournir simplement une réponse C # mise à jour
Essayez-le en ligne!
la source