La somme des chiffres d'un nombre - python
, Si je veux trouver la somme des chiffres d'un nombre, c'est à dire :
- Entrée:
932
- Sortie:
14
, qui est(9 + 3 + 2)
Quel est le moyen le plus rapide de le faire?
J'ai instinctivement fait:
sum(int(digit) for digit in str(number))
Et j'ai trouvé ceci en ligne:
sum(map(int, str(number)))
Quel est le meilleur à utiliser pour la vitesse, et y a-t-il d'autres méthodes qui sont encore plus rapides?
11 réponses
Vous pouvez le faire purement en entiers, et ce sera le plus efficace:
def sum_digits(n):
s = 0
while n:
s += n % 10
n //= 10
return s
Ou avec divmod
:
def sum_digits2(n):
s = 0
while n:
n, remainder = divmod(n, 10)
s += remainder
return s
Mais les deux lignes que vous avez affichées sont bien.
Encore plus rapide est la version sans affectations augmentées:
def sum_digits3(n):
r = 0
while n:
r, n = r + n % 10, n // 10
return r
> %timeit sum_digits(n)
1000000 loops, best of 3: 574 ns per loop
> %timeit sum_digits2(n)
1000000 loops, best of 3: 716 ns per loop
> %timeit sum_digits3(n)
1000000 loops, best of 3: 479 ns per loop
> %timeit sum(map(int, str(n)))
1000000 loops, best of 3: 1.42 us per loop
> %timeit sum([int(digit) for digit in str(n)])
100000 loops, best of 3: 1.52 us per loop
> %timeit sum(int(digit) for digit in str(n))
100000 loops, best of 3: 2.04 us per loop
Si vous voulez continuer à additionner les chiffres jusqu'à ce que vous obteniez un numéro à un chiffre (une de mes caractéristiques préférées des nombres divisibles par 9) Vous pouvez faire:
def digital_root(n):
x = sum(int(digit) for digit in str(n))
if x < 10:
return x
else:
return digital_root(x)
Ce qui s'avère être assez rapide lui-même...
%timeit digital_root(12312658419614961365)
10000 loops, best of 3: 22.6 µs per loop
Cela pourrait aider
def digit_sum(n):
num_str = str(n)
sum = 0
for i in range(0, len(num_str)):
sum += int(num_str[i])
return sum
Faire quelques défis Codecademy j'ai résolu ceci comme:
def digit_sum(n):
arr = []
nstr = str(n)
for x in nstr:
arr.append(int(x))
return sum(arr)
Vous pouvez également utiliser ceci:
def sum_digits(num):
num = str(num)
digitSum = 0
for i in num:
digitSum += int(i)
return digitSum
print sum_digits(875)
def digitsum(n):
result = 0
for i in range(len(str(n))):
result = result + int(str(n)[i:i+1])
return(result)
"result" est initialisé avec 0.
À l'intérieur de la boucle for, le nombre (n) est converti en une chaîne à diviser avec l'index de boucle(i) et obtenir chaque chiffre. ---> str(n)[i:i+1]
C'tranches de chiffres est converti en un entier ----> int(str(n)[i:i+1])
Et donc ajouté au résultat.
def sumOfDigits():
n=int(input("enter digit:"))
sum=0
while n!=0 :
m=n%10
n=n/10
sum=int(sum+m)
print(sum)
sumOfDigits()
La meilleure façon est d'utiliser une compréhension de liste:
sum([int(digit) for digit in str(abs(number))])
num = 123
dig = 0
sum = 0
while(num > 0):
dig = int(num%10)
sum = sum+dig
num = num/10
Print(somme) // assurez-vous d'ajouter de l'espace au-dessus de cette ligne
Vous pouvez essayer ceci
def sumDigits(number):
sum = 0
while(number>0):
lastdigit = number%10
sum += lastdigit
number = number//10
return sum
n = str(input("Enter the number\n"))
list1 = []
for each_number in n:
list1.append(int(each_number))
print(sum(list1))