#python
#python
Вопрос:
У меня такая проблема, я сделал положительный результат, но что делать, если это отрицательное число и его нужно суммировать? Пожалуйста, помогите.
Вопрос: Напишите вызываемую функцию sum_digits
.
Заданное число sum_digits
возвращает сумму всех его цифр.
output = sum_digits(1148)
print(output) # --> 14
Если число отрицательное, первая цифра должна считаться отрицательной.
output = sum_digits(-316)
print(output) # --> 4
Примечания:
Чтобы использовать некоторые из методов, которые будут наиболее полезны для вас, вы, скорее всего, захотите выполнить некоторое преобразование строки в число и наоборот.
Ниже приведена моя функция:
def sum_digits(num):
num_str = str(num)
num_sum = 0
for i in num_str:
dig = int(i)
num_sum = dig
return num_sum
Комментарии:
1. Пожалуйста, подумайте о принятии ответа; это говорит другим, что проблема решена, и помогает другим легче найти правильный ответ.
Ответ №1:
Если синтаксический анализ числа в строку вас устраивает, это простое решение должно быть в порядке вещей.
In [1]: def sum_digits(x):
...: x = str(x)
...: if x[0] == '-':
...: return sum(map(int, [x[:2], *x[2:]]))
...: return sum(map(int, x))
In [2]: sum_digits(1148)
Out[2]: 14
In [3]: sum_digits(-316)
Out[3]: 4
Ответ №2:
Однострочный только потому, что:
sum(map(int, num[1:])) (int(num[0]) if num[0] != '-' else int(num[0:2]) * 2)
Предполагается num
, что это строка, в противном случае преобразуйте ее в строку перед использованием приведенного выше.
num = str(num)
Ответ №3:
Нет необходимости в преобразовании строк. Это работает для положительных и отрицательных целых чисел:
def sum_digits(num):
if num < 0:
return -sum_digits(-num)
elif not num:
return 0
else:
return num % 10 sum_digits(num // 10)
Если рекурсии нет в меню:
def sum_digits(num):
factor, num, total = -1 if num < 0 else 1, abs(num), 0
while num:
total = num % 10
num = num // 10
return total * factor
Редактировать: кто-то указал, что вам может потребоваться вычесть только первую цифру, вместо того, чтобы результат был отрицательным, т. Е. -316
Как -3 1 6
вместо -(3 1 6)
. Если вы действительно хотите вычесть первую цифру, если число отрицательное:
def sum_digits(num):
factor, num, total = -1 if num < 0 else 1, abs(num), 0
while num:
total = num % 10 if num > 10 else factor * num
num = num // 10
return total
Для первых 2 примеров результатом для -316
будет -10
, для последнего результат будет 4
.
Комментарии:
1. Я думаю, вы пропустили детали в OP. Сумма для
-316
должна быть-3 1 6
, а не-(3 1 6)
2. Вы правы — я оставляю первые два, потому что это кажется более распространенной проблемой, но добавлено необходимое решение.
Ответ №4:
>>> def sum_digits(num):
... negative = num < 0 # returns Boolean of if number is negative or not
... if negative:
... value_1 = int(str(num)[1]) # get the first numerical digit i.e. in -35, 3
... num = str(abs(num)) # convert to modulus of number and to string
... num_sum = sum(int(i) for i in num) # sum of all the digits i.e. -35 = 8
... if negative:
... num_sum = num_sum - 2*value_1 # subtract 2*the first numerical digits i.e 8-(2*3) = 2
...
... return num_sum
...
>>> """test cases"""
>>> print(sum_digits(316))
10
>>> print(sum_digits(-316))
4
Простое и логичное решение
Ответ №5:
Просто добавьте if-оператор для обработки отрицательного регистра.
def sum_digits(num):
num_str = str(num)
num_sum = 0
# Check if number is negative (first char is negative sign)
if num_str[0] == "-":
# If so, subtract first digit then remove the first two chars
num_sum -= int(num_str[1])
num_str = num_str[2:]
# Number is now positive, so can deal with it accordingly
for i in num_str:
dig = int(i)
num_sum = dig
return num_sum
output = sum_digits(1148)
print(output) # --> 14
output = sum_digits(-316)
print(output) # --> 4
Ответ №6:
Я думаю, что такую простую проблему не следует решать с помощью преобразований str / int, срезов и других сложных инструментов. Итак, это мое решение:
def sum_digits(num: int) -> int:
is_negative = num < 0
num = abs(num)
num_sum = 0
while num > 10:
num_sum = num % 10
num = num // 10
if is_negative:
num_sum -= num % 10
else:
num_sum = num % 10
return num_sum