сумма цифр в строке, но как это сделать, если она начинается с отрицательного знака?

#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