Je suis nouveau dans les problèmes de mathématiques en python mais j'ai essentiellement le code suivant:
a = list(range(1,10000)) str(a) sum_of_digits = sum(int(digit) for digit in str(a[9998])) print(sum_of_digits)
cela me permet de calculer la somme des chiffres d'un nombre donné dans la liste a. mais au lieu d'introduire des nombres dans celui-ci un par un, je veux un moyen efficace de calculer la somme des chiffres de tous les nombres de a et de les imprimer tous à la fois. Je n'arrive pas à trouver une solution mais je sais que la réponse est probablement simple. toute aide est appréciée!
edit: je ne savais pas que ce post attirerait autant d'attention, pour ceux qui veulent plus de précisions, je veux essentiellement savoir quels chiffres de la liste de la plage 1,9999 a une somme de 34 ou plus. Je pense que tout le monde pensait que je voulais simplement prendre la somme des chiffres de chaque élément de la liste, puis compiler une somme totale. dans tous les cas, cette méthode m'a aidé à résoudre le problème réel
3 Réponses :
Essaye ça:
lst = [] for j in range(10000): for i in str(j): lst.append(int(i)) print(sum(lst))
C'est pareil, mais fonctionne lentement:
sum(int(i) for j in range(1,10000) for i in str(j))
Cela ne répond pas à la question. Pour critiquer ou demander des éclaircissements à un auteur, laissez un commentaire sous sa publication. - De l'avis
@ChathurangaChandrasekara: Pourquoi dites-vous que cela ne fournit pas de réponse? Je préférerais voir plus d'explications sur l'approche pour aider les nouveaux développeurs à comprendre la logique, et je ne peux pas attester s'il s'agit ou non de l'approche la plus efficace, voire la plus correcte. Mais c'est à cela que sert le mécanisme de vote.
cela me donne le numéro 18000 lorsque je l'imprime. c'est la bonne réponse selon l'explication floue que j'ai donnée mais ce que je cherchais réellement est mis à jour dans le post. Merci quand même!
c'est une réponse vraiment intéressante, voudriez-vous expliquer comment fonctionne le code? il calcule la somme de tous les chiffres sur une seule ligne. Je me demandais si je pouvais le modifier pour le faire pour des éléments individuels dans une liste et voir quelle somme est supérieure à 34
Un bon moyen simple de le faire est d'utiliser l'opérateur modulo %
, avec la division de plancher \\
:
total_sum = 0 for num in a: sum_of_digits = 0 while (num != 0): sum_of_digits = sum_of_digits + (num % 10) num = num//10 total_sum = total_sum + sum_of_digits print total_sum
Ici, l'expression n % 10
renvoie le reste de la division de n
par 10, ou en d'autres termes, elle renvoie le chiffre à la place des unités de ce nombre. Ce que fait la boucle while, c'est de diviser à plusieurs reprises le nombre par 10, puis d'ajouter le nombre à la place des unités au total.
Notez que la \\
(division du sol) est importante ici, car elle supprime toute valeur décimale du nombre, ce qui est nécessaire pour que modulo %
fonctionne correctement.
Remarque : Cette solution est massivement plus efficace que tout algorithme reposant sur str()
.
L'algorithme devrait fonctionner, mais vos deux notes sont (au moins partiellement) fausses. 1) Vous avez raison, cela devrait être plus rapide que la conversion en str
, mais la complexité est la même. Pour un nombre de k chiffres, vous devrez également faire %10
et //10
k fois. 2) Les nombres de la liste ne seront pas modifiés, puisque vous ne les réaffectez qu'à num
, pas à a[i]
.
Merci @tobias_k pour me vérifier sur place =)
De plus, c'est plus rapide, mais pas massivement . C'est environ 40% plus rapide qu'une compréhension de liste convertissant en str
et retour en int
, et à peu près 10% plus rapide que sum(map(int, str(n)))
je veux un moyen efficace de calculer la somme des chiffres de tous les nombres dans un
Si vous voulez vraiment un moyen efficace, ne calculez pas la somme de la somme des chiffres de tous les nombres individuels. Au lieu de cela, calculez la somme totale des chiffres de toute la plage 1 à la fois.
Par exemple, dans la plage allant jusqu'à
123
inclus, nous n'avons pas besoin d'écrire tous les nombres individuels pour voir que le dernier chiffre parcourra les nombres 1 à 9 un total de 12 fois, plus les nombres 1 à 3 une fois . Le chiffre du milieu passe de 1 à 9 une fois, en affichant 10 fois, puis 10 fois 1 et 4 fois 2. Et pour le premier chiffre, seul le 1 apparaît 24 fois. Ainsi, le total est de45*12 + 1+2+3 + 45*10 + 10 + 8 + 24 = 1038
.Vous pouvez mettre cela dans une formule récursive en utilisant "un peu" de modulo magic.
>>> n = 1234567 >>> sum(int(c) for i in range(1, n+1) for c in str(i)) 32556016 >>> dsum(n) 32556016 >>> dsum(12345678901234567890) 1047782339654778234045Cela donne les mêmes résultats que l'approche «naïve», mais avec un temps d'exécution de O (log n) au lieu de O (n), il peut être utilisé pour calculer la somme des chiffres de plages de nombres ridiculement grandes.
def dsum(n, f=1, p=1): if n: d, r = divmod(n, 10) k = (45*d + sum(range(r)))*f + r*p return dsum(d, f*10, p + f*r) + k return 01) Cela suppose que votre liste est toujours une plage de nombres commençant à 1 jusqu'à une limite supérieure, bien que cela fonctionne également pour une plage ne commençant pas à 1 en calculant la somme des chiffres pour la limite supérieure, puis en soustrayant la somme des chiffres pour la borne inférieure. Si la liste n'est pas une plage, alors il n'y a aucun moyen de calculer la somme des chiffres pour tous les nombres individuels, cependant.
Voulez-vous la somme des chiffres des nombres dans une liste, ou pour tous les nombres jusqu'à une certaine limite, qui pourrait être beaucoup plus grande que ce qui peut être stocké dans une liste ou calculé en boucle, c'est-à-dire jusqu'à des milliards ou des trillions ?
la somme des chiffres de nombres individuels dans une liste