Tout d'abord, les gens qui vous disent que vous ne pouvez pas résoudre ce problème avec la force brute en moins d'une minute sont erronées. Un algorithme de force brute pour un problème de cette taille s'exécutera en quelques secondes.Deuxièmement, le code que vous avez publié a plusieurs problèmes, certains d'entre eux déjà mentionné.
- Vous devez mettre fin à la boucle en mettant
one
à une valeur autre que 0
une fois que vous atteignez votre état de but (où vous actuellement print a
).
- Vous ne réinitialisez jamais la liste (
l = []
). Cela devrait être fait chaque fois que vous recalculez a
et b
, juste avant d'entrer dans la boucle for.
- La question demande que le premier numéro de triangle ait sur cinq cents diviseurs. Votre condition de résiliation doit être
if len(l) > 500:
.
- Vous ne voulez probablement pas
print a
à l'intérieur de la boucle for, mais attendez que la boucle while soit terminée.
La chose qui est vraiment vous ralentir est que pour chaque numéro de triangle a
vous vérifiez toutes les valeurs jusqu'à a/2
pour voir si elle est un diviseur. Votre seul besoin de vérifier les valeurs jusqu'à la racine carrée de a
. De cette façon, pour chaque valeur de x
, si x
est un diviseur, vous pouvez simplement ajouter x
et a/x
à la liste.
Voici votre code avec les modifications que je décrit ci-dessus:
import math
def main():
l = []
one = 0
a = 1
b = 2
while one == 0:
a = a + b
b += 1
l = []
sqrt_a = int(math.sqrt(a))
for x in range(1, sqrt_a + 1):
if a % x == 0:
l.append(x)
if x < math.sqrt(a):
l.append(a // x)
if len(l) > 500:
# print(a)
one = 1
print(a, b, len(l))
if __name__ == '__main__':
main()
Vous verrez qu'il fonctionne dans environ 5 ou 6 secondes, si bien moins d'une minute avec ces modifications.
Veuillez ne pas poster de code où "one == 0" est vrai. Ça fait mal de regarder: | –
Habituez-vous :-) C'est une comparaison aussi bonne que n'importe quelle autre. Et dans ce programme, c'est toujours vrai ... –
'l = []' devrait être dans la boucle 'while' sinon il accumule le diviseur pour tous les nombres triangulaires et pas seulement un. – jfs