Je viens de terminer la 3ème question du projet Euler qui vous demande de trouver le plus grand facteur premier d'un nombre donné. J'ai fait une fonction qui retourne une liste de tous les facteurs premiers pour un nombre.Comment calculer les exposants des facteurs premiers pour un nombre donné?
Par exemple, si vous entrez 100 il reviendriez [2.0, 5.0]
Je veux essayer de faire maintenant un programme qui retourne une liste avec les principaux facteurs qui apparaissent le même nombre de fois que leur exposant. Ainsi, par exemple, entrer 100 retournerait plutôt [2.0, 2.0, 5.0, 5.0] (parce que 100 est 2^2 * 5 * 2).
J'ai écrit une fonction qui le fait correctement si une liste contient les facteurs premiers et une liste contenant les exposants. Le problème est que la fonction que j'ai utilisée pour obtenir la liste des exposants est fausse.
Le code que j'ai écrit échoue pour certains nombres (18, 36, 50, 54 ...). Je suis assez nouveau à la programmation, donc si quelqu'un pouvait m'aider, je l'apprécierais vraiment.
def p_fctr_exp(n):
"""Prime factorises n and gives the exponents of each factor"""
l1 = prime_factors(n) #Initialisation of variables and lists ('prime_factors()) is just the function I made which gives a list of the prime factors
p = 1
exp=[]
result=[]
for x in l1: #This multiplies the prime factors together just once
x = float(x)
p = (p * x)
for x in range(0,len(l1)):
"""Loop which cycles through factors from smallest first and multiplies
the total by the factor until the point where one more would make it bigger
than the target number. The number of cycles required is stored in the
list 'exp'"""
a=1
while p<n:
p = p*float(l1[x])
a+=1
if p == n:
exp.append(a)
elif x < len(l1)-1:
exp.append(a-1)
return exp
Je pense que le problème se produit dans la boucle while puisqu'il fonctionne en multipliant le p du produit par le premier facteur le plus bas jusqu'à ce que cela devient trop grand, puis de passer au prochain facteur premier. Le problème est si l'exposant correct doit être 2, mais l'augmenter à 3 ne rend pas le produit plus grand que le nombre cible. J'ai l'impression que c'est probablement la mauvaise façon de résoudre le problème, mais je suis coincé sur ce qu'il faut changer.
Juste curieux: nombres premiers sont toujours entiers, alors pourquoi êtes-vous flotteurs de retour? –
Veuillez corriger votre indentation. –
Je pense qu'il renvoie des flottants à cause de la manière (probablement inutilement compliquée) que ma fonction trouve les facteurs premiers, il divise pour voir si la réponse est un entier mais si je n'ai pas utilisé la division flottante alors la réponse était toujours un entier . Cela ne semble pas faire autant de différence, alors je l'ai juste laissé. Je pense que l'indentation devrait être réparée maintenant aussi –