2010-03-14 8 views
0

J'ai un list des nombres (integers) (disons, de 1 à 10).Python - Vérifiez si les nombres dans la liste sont des facteurs d'un nombre

Ils ne sont pas nécessairement consécutifs, mais ils sont dans l'ordre croissant.

J'ai demandé à l'utilisateur plusieurs fois d'entrer un choix parmi les numéros disponibles. Lorsque ce numéro est entré, il est retiré de la liste avec l'un de ses facteurs qui peut être là.

J'ai empêché l'utilisateur de sélectionner des nombres premiers. Cependant, à un moment donné, il peut y avoir des nombres non premiers là, qui n'ont aucun facteur restant.

Je suis relativement nouveau à Python, donc je vais avoir du mal à mettre en œuvre:

  • Vérifier si le numéro sélectionné n'a pas autres facteurs (même si ce n'est pas premier).

  • Vérification de la présence de nombres premiers ou de nombres sans facteurs .

Je pense à l'aide for déclarations, mais je ne sais pas exactement comment les mettre en œuvre. Quelqu'un peut-il offrir des conseils, ou du code? Merci d'avance ...

Répondre

3

Pour vérifier s'il y a des facteurs du nombre guess restants vous pouvez utiliser any():

hasfactors = any(guess % n == 0 for n in numbers) 

Pour vérifier si tous les numéros restants sont premiers, all() peut être utilisé. (Puisque vous dites que vous avez déjà empêché l'utilisateur d'entrer des nombres premiers, je suppose que vous avez une sorte de isprime() fonction):

onlyprimes = all(isprime(n) for n in numbers) 
+0

Tous les commentaires ont été utiles, mais j'utilisé votre méthode OnlyPrimes, et a trouvé la méthode tout() pratique pour d'autres utilisations. Merci! Et vous avez prédit juste, j'ai eu une fonction IsPrime() ... – Zach

2

Pour le premier problème, vous pouvez utiliser les listes de compréhension pour construire une nouvelle liste où chaque élément n'est pas le nombre sélectionné et pas un facteur du nombre sélectionné (voir le code). Comparez cela avec votre liste d'origine.

$ python 
>>> selected_number = 6 
>>> [x for x in range(1,11) if selected_number % x] 
[4, 5, 7, 8, 9, 10] 

Pour le second problème, vérifiez si chaque élément est premier. Si non, vérifiez les numéros sans facteurs; Pour chaque élément, vous pouvez mod sur la liste d'origine et vérifier s'il s'agit d'une liste de zéros. Je suis sûr qu'il y a un moyen plus rapide, cependant.

1

Si L est une liste de numéros non nuls, la liste de ceux qui sont des facteurs d'un nombre N est:

factors = [x for x in L if N % x == 0] 

La liste sera tout simplement vide si N n'a pas de facteurs en L, de cours. Je ne suis pas sûr de ce que vous entendez par "nombres sans facteurs", sauf si vous voulez dire "primes" (?) - il y a eu plusieurs questions et réponses sur la vérification de la primalité en Python, j'utiliserais gmpy.is_prime (de mon extension gmpy) mais bien sûr je suis partial ;-). Si vous voulez dire, "tous les nombres qui n'ont aucun facteur dans L", eh bien, ils sont infiniment nombreux, donc c'est assez difficile de faire une liste de tous. Un générateur sans bornes pour eux

import itertools 

def nofactorsinlist(L): 
    for i in itertools.count(): 
    if any(x for x in L if i % x == 0): 
     continue 
    yield i 

Quelques optimisations serait possible, mais celui-ci est très simple et je suis peu disposé à ajouter des optimisations complexes sans comprendre exactement ce que vous êtes après!-)

Questions connexes