Comment trouver la somme de tous les multiples de 3 ou de 5 à moins de 1000 en Python?
Pas sûr si je devrais ai posté ça sur les mathématiques.stackexchange au lieu de cela, mais il inclut plus de la programmation donc je l'ai posté ici.
La question semble vraiment simple, mais je suis assis ici pendant au moins une heure maintenant est de ne pas essayer de le comprendre. J'ai essayé différentes solutions, et de lire les formules mathématiques pour elle, etc, mais il ne me donne le droit de réponse lors du codage! J'ai fait deux solutions différentes pour elle, qui à la fois me donne la mauvaise réponse. La première solution me donne 265334 tandis que le second me donne 232169. La réponse est 233168, de sorte que la deuxième solution est plus proche.
Je dois mentionner que c'est une question de Projet Euler, le premier pour être précis.
Voici mon code. Toutes les idées ce qui est faux?
nums = [3, 5]
max = 999
result = 0
for num in nums:
for i in range(1,max):
if num*i < max:
result += num*i
print result
result = 0
for i in range(0,max):
if i%3 == 0 or i%5 == 0:
result += i
print result
Certainement n'appartient pas à les mathématiques pile d'échange c'est une variation sur un (un peu connu) programmation de la question de l'entrevue appelé fizz buzz.
J'ai simplement répondu à une question similaire. Le code est en Java, mais il devrait être facile à traduire en Python.
votre solution est O(n), cela peut être facilement résolu en O(1) fois.
sum [3,6..999] + sum [5,10..999] - sum [15,30..999]
OriginalL'auteur qwerty | 2011-05-08
Vous devez vous connecter pour publier un commentaire.
range(k,max)
ne comprend pasmax
, si vous êtes vraiment vérifier jusqu'à et y compris 998 (alors que 999 est un multiple de 3). Utilisationrange(1,1000)
à la place.OriginalL'auteur Fred Foo
Vous surcharger les choses. Vous avez juste besoin d'une liste de nombres qui sont multiples de 3 ou de 5 qui vous permet d'obtenir facilement avec un compréhension de liste:
Ensuite utiliser
somme
pour obtenir le total:Ou même mieux d'utiliser un générateur d'expression à la place:
Ou même mieux mieux (avec l'aimable autorisation Exelian):
Vous devez vous interprétations de la liste sont grands 😀
Dans ce cas, le générateur d'expressions sont encore mieux:
sum(i for i in xrange(1,1000) if (i%3 == 0) or (i%5 == 0))
, ni des tableaux doit être créé. Non pas que vous remarquerez toute la différence pour 1000, mais parfois la création d'énormes listes convient d'éviter.Absolument, un excellent point.
J'ose dire que vous avez encore trop compliqué. Essayez ceci:
sum(set(range(0, 1000, 3) + range(0, 1000, 5)))
OriginalL'auteur zeekay
Le problème avec votre première solution, c'est qu'il double-compte des multiples de 15 (parce qu'ils sont des multiples de 3 et 5).
Le problème avec la deuxième solution, c'est qu'il ne compte pas 999 (multiple de 3). Juste mettre
max = 1000
pour résoudre ce problème.OriginalL'auteur Gabe
J'aime le plus:
any(n % d == 0 for d in divisors)
, on peut supposer qu'il fait à peu près le même travail, mais si c'est purement une différence esthétique.OriginalL'auteur pillmuncher
résultat = 0
for i in range(0,1000):
résultat d'impression
0
3
5
6
9
.
.
.
993
995
996
999
233168
OriginalL'auteur user3770705
Cela fonctionne, mais l'utilisation de 1000 pour max, de sorte qu'il comprend 999 trop.
OriginalL'auteur Jaanus
Je sais que c'était il y a 3 mois, mais comme une expérience, parce que je suis nouveau sur le python, j'ai décidé d'essayer et de combiner certaines des autres personnes de réponses et je suis venu avec une méthode, vous pouvez passer le nombre max de et les diviseurs comme une liste et retourne la somme:
OriginalL'auteur DigitalFiz
Il y a étage(999/3) des multiples de 3, étage(999/5) les multiples de 5, et le plancher(999/15) des multiples de 15, moins de 1000.
Pour 3, ce sont: 3 + 6 + 9 + 12 +... + 999 = 3 * (1 + 2 + 3 + 4 +...+333)
= 3 * (333 * 334 /2) parce que la somme des entiers de 1 à k est k*(k+1)/2.
Utiliser la même logique pour la somme de multiples de 5 et 15. Cela donne une constante de temps de la solution. Généraliser cette arbitraires d'entrées.
OriginalL'auteur Dave
Je sais que c'est à partir de 6 ans, mais j'ai juste pensé id de la part d'une solution qui a trouvé à partir d'une formule math que j'ai trouvé intéressant, car il élimine la nécessité de faire une boucle par tous les nombres.
https://math.stackexchange.com/a/9305
Sorties le suit
OriginalL'auteur w_jay
Je pense que les dernières lignes de votre code sont importantes.
Le ou la déclaration est la clé de l'énoncé dans le présent code.
Aussi évaluateurs qu'réglage de la valeur maxi à 999, vous devez le régler à 1000 afin qu'il couvre toutes les valeurs.
Voici mon code.
OriginalL'auteur Anuj Kulkarni
OriginalL'auteur Umesh Yadav
Vous pouvez également utiliser la programmation fonctionnelle des outils (filtre):
Ou utiliser deux listes avec la soustraction des multiples de 15 ans (qui apparaît dans les deux listes):
J'aime bien cette solution, mais je suppose qu'il a besoin de quelques améliorations...
OriginalL'auteur Alex Bogomolov
Ici, vous allez:
OriginalL'auteur PhysicsLot
voici ma solution:
OriginalL'auteur Emily Fotopoulou
c'est ma solution
OriginalL'auteur Shreyansh Mehta
OriginalL'auteur
Je sais que c'était il y a 7 ans mais j'ai envie de partager ma solution à ce problème.
OriginalL'auteur Umut Tolek
J'ai eu à le faire dans la plage de 1 à 100
C'est la façon dont je l'ai fait.
Donc avec 1000, il suffit de changer l'ordre de 100 à 1000
J'ai dû trouver les multiples de 3 et de 5 à moins de 100, donc si vous avez besoin de 3 ou de 5 juste à le changer ou et il vous donnera plus de réponses. Je viens juste de commencer à apprendre, donc corrigez-moi si je me trompe
OriginalL'auteur Manon Collins