Как найти сумму всех чисел в строке

numbers = "22.32 3.74 4.67 "
print(sum(numbers))          

Как получить сумму чисел, находящихся в строке?

0xdb's user avatar

0xdb

51.4k194 золотых знака56 серебряных знаков232 бронзовых знака

задан 19 мая 2021 в 12:30

Jack's user avatar

11

Разложите строку на числа (по пробелу), а элементы переведите во флоат:

str_num = "22.32      3.74     4.67               "
nums_sum = sum(float(x) for x in str_num.split())

>>> nums_sum
30.730000000000004

или

nums_sum = round(sum(float(x) for x in str_num.split()), 2)

чтоб округлить сразу ответ

ответ дан 19 мая 2021 в 12:53

Jack_oS's user avatar

Jack_oSJack_oS

12.5k7 золотых знаков18 серебряных знаков48 бронзовых знаков

4

Ладно, раз пошли подсказки в виде полного кода, то вот ещё функциональный вариант, плюс форматирование чтобы без лишних знаков:

numbers = "22.32 3.74 4.67 "
print(f'{sum(map(float, numbers.split())):g}')

Вывод:

30.73

ответ дан 19 мая 2021 в 13:18

CrazyElf's user avatar

CrazyElfCrazyElf

65.4k5 золотых знаков19 серебряных знаков50 бронзовых знаков

2

Given a string S containing alphanumeric characters, The task is to calculate the sum of all numbers present in the string.

Examples: 

Input:  1abc23
Output: 24
Explanation: 1 + 23 = 24

Input:  geeks4geeks
Output: 4

Input:  1abc2x30yz67
Output: 100

Approach:

Scan each character of the input string and if a number is formed by consecutive characters of the string, then increment the result by that amount. The only tricky part of this question is that multiple consecutive digits are considered one number.

Follow the below steps to implement the idea:

  • Create an empty string temp and an integer sum.
  • Iterate over all characters of the string.
    • If the character is a numeric digit add it to temp.
    • Else convert temp string to number and add it to sum, empty temp.
  • Return sum + number obtained from temp.

Below is the implementation of the above approach:

C++

#include <iostream>

using namespace std;

int findSum(string str)

{

    string temp = "";

    int sum = 0;

    for (char ch : str) {

        if (isdigit(ch))

            temp += ch;

        else {

            sum += atoi(temp.c_str());

            temp = "";

        }

    }

    return sum + atoi(temp.c_str());

}

int main()

{

    string str = "12abc20yz68";

    cout << findSum(str);

    return 0;

}

Java

import java.io.*;

class GFG {

    static int findSum(String str)

    {

        String temp = "0";

        int sum = 0;

        for (int i = 0; i < str.length(); i++) {

            char ch = str.charAt(i);

            if (Character.isDigit(ch))

                temp += ch;

            else {

                sum += Integer.parseInt(temp);

                temp = "0";

            }

        }

        return sum + Integer.parseInt(temp);

    }

    public static void main(String[] args)

    {

        String str = "12abc20yz68";

        System.out.println(findSum(str));

    }

}

Python3

def findSum(str1):

    temp = "0"

    Sum = 0

    for ch in str1:

        if (ch.isdigit()):

            temp += ch

        else:

            Sum += int(temp)

            temp = "0"

    return Sum + int(temp)

str1 = "12abc20yz68"

print(findSum(str1))

C#

using System;

class GFG {

    static int findSum(String str)

    {

        String temp = "0";

        int sum = 0;

        for (int i = 0; i < str.Length; i++) {

            char ch = str[i];

            if (char.IsDigit(ch))

                temp += ch;

            else {

                sum += int.Parse(temp);

                temp = "0";

            }

        }

        return sum + int.Parse(temp);

    }

    public static void Main(String[] args)

    {

        String str = "12abc20yz68";

        Console.WriteLine(findSum(str));

    }

}

Javascript

<script>

    function findSum(str)

    {

        let temp = "0";

        let sum = 0;

        for (let i = 0; i < str.length; i++) {

            let ch = str[i];

            if (!isNaN(String(ch) * 1))

                temp += ch;

            else {

                sum += parseInt(temp);

                temp = "0";

            }

        }

        return sum + parseInt(temp);

    }

    let str = "12abc20yz68";

    document.write(findSum(str));

</script>

Time complexity: O(N) where n is length of the string. 
Auxiliary Space: O(N) where n is length of the string.

Calculate sum of all numbers present in a string using recursion

The idea is to recursively traverse over the string and find out the numbers then add these numbers to the result, at last return the result

Follow the below steps to implement the idea:

  • Create an empty string temp and an integer sum.
  • Recursively traverse the characters for every index i from 0 to length – 1.
    • If i = N-1 then check if current character is a digit return str[i] – ‘0’.
    • Else return 0.
    • If str[i] is a digit.
      • Run a for loop with counter from i to N – 1.
        • If the character is a numeric digit add it to temp.
        • Else break.
      • Return sum of numeric value of temp + recur for index j.

Below is the implementation of the above approach:

C++

#include <iostream>

using namespace std;

int solve(string& str, int i, int n)

{

    if (i >= n)

        return 0;

    if (i == n - 1) {

        if (isdigit(str[i])) {

            return str[i] - '0';

        }

        else {

            return 0;

        }

    }

    if (isdigit(str[i])) {

        string temp = "";

        int j;

        for (j = i; j < n; j++) {

            if (isdigit(str[j]))

                temp += str[j];

            else

                break;

        }

        return stoi(temp) + solve(str, j, n);

    }

    else {

        solve(str, i + 1, n);

    }

}

int findSum(string str)

{

    return solve(str, 0, str.size());

}

int main()

{

    string str = "12abc20yz68";

    cout << findSum(str);

    return 0;

}

Java

import java.util.Scanner;

class Main {

  static int solve(String str, int i, int n) {

    if (i >= n)

      return 0;

    if (i == n - 1) {

      if (Character.isDigit(str.charAt(i))) {

        return str.charAt(i) - '0';

      }

      else {

        return 0;

      }

    }

    if (Character.isDigit(str.charAt(i))) {

      String temp = "";

      int j;

      for (j = i; j < n; j++) {

        if (Character.isDigit(str.charAt(j)))

          temp += str.charAt(j);

        else

          break;

      }

      return Integer.parseInt(temp) + solve(str, j, n);

    }

    else {

      return solve(str, i + 1, n);

    }

  }

  static int findSum(String str) {

    return solve(str, 0, str.length());

  }

  public static void main(String[] args) {

    String str = "12abc20yz68";

    System.out.println(findSum(str));

  }

}

Python3

def findSum(str):

    result = 0

    temp = ""

    for i in range(len(str)):

        if str[i].isnumeric():

            temp += str[i]

            if i == len(str) - 1:

                result += int(temp)

        else:

            if temp != "":

                result += int(temp)

                temp = ""

    return result

if __name__ == "__main__":

    str = "12abc20yz68"

    print(findSum(str))

C#

using System;

using System.Linq;

using System.Collections.Generic;

class GFG

{

    static bool isdigit(char c)

    {

        if(c>='0' && c<='9')

            return true;

        return false;

    }

    static int solve(string str, int i, int n)

    {

        if (i >= n)

            return 0;

        if (i == n - 1) {

            if (isdigit(str[i])) {

                return str[i];

            }

            else {

                return 0;

            }

        }

        if (isdigit(str[i])) {

            string temp = "";

            int j;

            for (j = i; j < n; j++) {

                if (isdigit(str[j]))

                    temp += str[j];

                else

                    break;

            }

            return Int32.Parse(temp) + solve(str, j, n);

        }

        else {

            return solve(str, i + 1, n);

        }

    }

    static int findSum(string str)

    {

        return solve(str, 0, str.Length);

    }

    static public void Main()

    {

        string str = "12abc20yz68";

        Console.Write(findSum(str));

    }

}

Javascript

function findSum(str) {

    let result = 0;

    let temp = "";

    for (let i = 0; i < str.length; i++) {

        if (!isNaN(str[i])) {

            temp += str[i];

            if (i === str.length - 1) {

                result += parseInt(temp);

            }

        } else {

            if (temp !== "") {

                result += parseInt(temp);

                temp = "";

            }

        }

    }

    return result;

}

console.log(findSum("12abc20yz68"));

Time Complexity: O(N), where N is the size of the given string.
Auxiliary Space: O(N), in worst case it can cost O(N) recursive calls

Calculate sum of all numbers present in a string using Regex in Python:

The idea is to use inbuilt function Python RegEx. 

Below is the Implementation of above approach:

C++14

#include <iostream>

#include <regex>

int findSum(std::string str) {

    std::regex pattern("\d+");

    std::smatch match;

    int sum = 0;

    while (std::regex_search(str, match, pattern)) {

        sum += stoi(match[0].str());

        str = match.suffix().str();

    }

    return sum;

}

int main() {

    std::string str = "12abc20yz68";

    std::cout << findSum(str) << std::endl;

    return 0;

}

Python3

import re

def find_sum(str1):

    return sum(map(int, re.findall('d+', str1)))

str1 = "12abc20yz68"

print(find_sum(str1))

Javascript

function find_sum(str1) {

    return str1.match(/d+/g).reduce((acc, val) => acc + parseInt(val), 0);

}

const str1 = "12abc20yz68";

console.log(find_sum(str1));

Java

import java.util.regex.*;

public class Main {

    public static int findSum(String str)

    {

        Pattern pattern = Pattern.compile("\d+");

        Matcher matcher = pattern.matcher(str);

        int sum = 0;

        while (matcher.find()) {

            sum += Integer.parseInt(matcher.group());

            str = matcher.replaceFirst("");

            matcher = pattern.matcher(str);

        }

        return sum;

    }

    public static void main(String[] args)

    {

        String str = "12abc20yz68";

        System.out.println(findSum(str));

    }

}

C#

using System;

using System.Text.RegularExpressions;

public class GFG

{

    public static int FindSum(string str)

    {

        Regex pattern = new Regex(@"d+");

        Match matcher = pattern.Match(str);

        int sum = 0;

        while (matcher.Success)

        {

            sum += Int32.Parse(matcher.Value);

            str = pattern.Replace(str, "", 1, matcher.Index);

            matcher = pattern.Match(str);

        }

        return sum;

    }

    static public void Main()

    {

        string str = "12abc20yz68";

        Console.WriteLine(FindSum(str));

    }

}

Time complexity: O(n) where n is length of the string. 
Auxiliary Space: O(n) where n is length of the string.

This article is contributed by Aditya Goel. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks. 

Last Updated :
20 Mar, 2023

Like Article

Save Article

Вычисляет сумму всех элементов в последовательности.

Синтаксис:

sum(iterable, /, start=0)

Параметры:

  • iterable — объект, поддерживающий итерацию,
  • start — число, начальное значение для суммы.

Возвращаемое значение:

  • сумма элементов.

Описание:

Функция sum() начинает суммирование элементов последовательности iterable с начального значения start, если оно указано, сложение происходит слева направо и в результате возвращает их сумму.

Функция sum() ожидает, что элементы iterable являются числами, а начальное значение start не может быть строкой. Если аргумент iterable пуст, то функция sum() возвращает начальное значение start, если оно указано.

Для некоторых случаев использования функции sum() есть хорошие альтернативы:

  • Для суммирования чисел с плавающей запятой с повышенной точностью используйте math.fsum().
  • Предпочтительный и быстрый способ объединить последовательность строк — это вызов метода str.join(sequence).
  • Чтобы объединить нескольких последовательностей, рассмотрите возможность использования itertools.chain().

Изменено в Python 3.8: Параметр start может быть указан как аргумент ключевого слова.

Примеры вычисления суммы разных последовательностей.

  • Стандартные приемы вычисления суммы,
  • Вычисление суммы списка строк с числами,
  • Подсчет суммы чисел в строке разделенных пробелами.
  • Подсчет суммы цифр в числе.
  • Считаем число «Души» (нумерология).

Стандартные приемы вычисления суммы.

>>> x = []
>>> sum(x)
# 0

# Сумма чисел, переданных 
# в качестве аргументов (каждая отдельно).
>>> sum(x, 10)
# 10

# сумма списка целых чисел
>>> x = [1, 2, 3, 4]
>>> sum(x, 10)
# 20

# сумма списка целых и десятичных чисел
>>> x = [1.1, 2.2, 3.3, 4.256]
>>> sum(x, 1)
# 11.856000000000002
>>>

Вычисление суммы списка строк с числами.

Для преобразования списка строк с числами включая десятичные c разделением их по типам int и float, необходимо перед преобразованием в тип float проверять строку на вхождение точки ‘.’.

Для проверки строки на целое число перед преобразованием проверим, что строка состоит только из десятичных чисел str.isdigit().

После выполнения всех преобразований применим функцию sum().

>>> str_list = ['8.3', '11', 'девять.', '1', '5', '3', '9', 'пять', '15', '13', '7', '13.9', 'число']
>>> def str_to_num(str):
...     str = str.strip()
...     if '.' in str and str.replace('.', '').isdigit():
...         return float(str)
...     elif str.isdigit():
...         return int(str)
... 
>>> num_list = []
>>> for i in str_list:
...     n = str_to_num(i)
...     if n is not None:
...         num_list.append(str_to_num(i))

>>> num_list
# [8.3, 11, 1, 5, 3, 9, 15, 13, 7, 13.9]
>>> sum(num_list)
# 86.2

Подсчет суммы чисел в строке разделенных пробелами/запятыми/подстрокой.

В этом случае необходимо сначала преобразовать строку с числами, разделенные пробелами/запятыми или какой либо подстрокой в список строк с числами.

Это можно сделать следующими способами:

  • по разделителю, например пробелу ' ' или ';' методом строки str.split(),
  • по разделителю, состоящему из регулярного выражения функцией re.split(),
  • вытащить все цифры из исходной строки при помощи функцией re.findall().

Дальнейший алгоритм вычисления суммы чисел, находящихся в строке с разделителем будет аналогичен предыдущему примеру.

>>> line = '8.3 11 девять 1 5 3 9 пять 15 13 7 13.9 число'
# 1 - используем метод строки str.split()
>>> str_list = line.split(' ')
>>> str_list
# ['8.3', '11', 'девять', '1', '5', '3', '9', 'пять', '15', '13', '7', '13.9', 'число']

# 3 способ - используем функцию re.findall()
>>> line = '8.3 11 девять. 1 5 3 9 пять 15 13 7 13.9 число'
>>> match = re.findall(r'[d.?,?]+', line)
>>> list(match)
# ['8.3', '11', '1', '5', '3', '9', '15', '13', '7', '13.9']

# Далее будем делать то же самое что и в предыдущем примере
...
# Выполняем преобразование списка строк с 
# числами str_list в  список целых и десятичных чисел
...

# в итоге преобразований, описанных в предыдущем
# примере получаем список чисел, к которым 
# применим функцию 'sum()'
>>> num_list
# [8.3, 11, 1, 5, 3, 9, 15, 13, 7, 13.9]
>>> sum(num_list)
# 86.2

Подсчет суммы цифр в числе.

Допустим есть число, целое или вещественное и необходимо подсчитать сумму цифр этого числа. Для того, что бы это сделать нужно это число преобразовать в список входящих в него цифр, а потом применить к полученному списку функцию sum().

Алгоритм действий будет следующим:

  • преобразуем число в строку при помощи функции str();
  • число может быть как int, так и float, следовательно необходимо произвести замену десятичного разделителя '.' при помощи строкового метода str.replace();
  • преобразовываем полученную строку с числом в список строк с цифрами функцией list();
  • далее преобразовываем каждый элемент полученного списка строк с цифрами в список целых чисел используя функцию map();
  • применяем функцию sum() к итоговому списку.
>>> pi = 3.1415926
# число в строку
>>> str_pi = str(pi)
# производим замену десятичного разделителя
>>> str_pi = str_pi.replace('.', '')
# строку с числом в список строк с цифрами
>>> lst_str = list(str_pi)
# преобразовываем каждый элемент полученного
# списка строк с цифрами в список целых чисел
>>> lst_num = map(int, lst_str)
# применяем функцию `sum()`
>>> s = sum(lst_num)
>>> s
# 31

Считаем число «Души» (нумерология).

Есть такая эзотерическая концепция «Нумерология«, согласно которой числа определяют нашу жизнь и существование всего, что нас окружает. Так вот, в ней есть понятие «числа души человека«, которое считается сложением всех цифр в дате его рождения, пока не получится число, которое меньше 10. То есть число от 1 до 9.

Например, есть дата рождения 29.09.2019 г. Тогда число души считается следующим образом:

  1. 2 + 9 + 0 + 9 + 2 + 0 + 1 + 9 = 32
  2. 3 + 2 = 5

Изобразим подсчет числа «Души» на языке Python. Для краткости, воспользуемся понятием выражения генератора-списка:

def soul(num):
    # считаем до тех пор пока длина 
    # строкового представления `num` больше 1 
    while len(str(num)) > 1:
        # функция sum() складывает список цифр
        # для краткости воспользуемся генератором списка
        num = sum( # генератор-списка
                  [int(n) # преобразуем строку в цифру   
                   # проходимся по элементам списка строк
                   for n in list(str(num)) # список строк из числа (даты)
                   # проверяем строку на цифру
                   if n.isdigit()]
                 )
    return num

# дата
date = '29.09.2019'
s = soul(date)
print(date, '=>', s)
# 29.09.2019 => 5

# целое число
num = 1357
s = soul(num)
print(num, '=>', s)
# 1357 => 7

# вещественное число 
pi = 3.1415926
s = soul(pi)
# 3.1415926 => 4

Раз регулярные выражения использовать нельзя, пиши конечный автомат. Там будет всего пара состояний(читаем число(D), читаем не число(C)) и переходы между ними.
Вначале находится в состоянии С.
Находясь в состоянии С, видим цифру — переходим в состояние D, и пишем цифру в буфер, переходим на следующий символ. Находясь в состоянии С и видя не-цифру, остаёмся в С и переходим на следующий символ.
Находясь в состоянии D и видя цифру — остаёмся в D и дописываем цифру в буфер. Находясь в состоянии D и видя не-цифру, переходим в состояние C, буфер прибавляем к сумме, буфер очищаем.
Буфер может быть сразу числом, тогда добавление в него значит buffer = buffer*10+d, а очищение — присваивание нуля.

String str = text.trim();
String digits="";
            int sum = 0;
            str+=" ";
            for (int i = 0; i < str.length(); i++) {
              char chrs = str.charAt(i);
              if (Character.isDigit(chrs))
                digits+=chrs;
              else{
                  if(!digits.equals(""))
                     sum+= Integer.parseInt(digits);
                  digits = "";
              }
              
            }
            System.out.println(sum);

import java.util.Scanner;

public class Test2 {
    public static void main(String[] args) {

        Scanner textString = new Scanner(System.in);
        System.out.println("Введите фразу:");
        String userPhrase = textString.nextLine();

        System.out.println("=========================================================n");
        System.out.println("Ваша фраза:t" + userPhrase);

        String number = "";
        char symbol = ' ';
        int indicator = 0;
        double sum = 0;


        for (int i = 0; i < userPhrase.length(); i++) {
            symbol = userPhrase.charAt(i); //запишем текущий символ в переменную

            if (Character.isDigit(symbol) == false && indicator > 0) { //если символ является не цифрой, то число уже считано и его можно записать в переменную sum
                System.out.println("Замечено число: " + Integer.parseInt(number));
                sum = sum + Integer.parseInt(number);
                indicator = 0;
                number = "";
            }

            if (Character.isDigit(symbol)) {  //если символ является числом то запишем его в строковую переменную number
                number += symbol;
                indicator++;
            }


        }
        if (indicator > 0) //если фраза заканчивается на число
            sum = sum + Integer.parseInt(number);


        System.out.println("=======================Result=================================n");
        System.out.println("Сумма всего зароботка: " + sum);


    }
}

У меня получилось так.

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);
System.out.println(«Введите фразу: «);
String text = scanner.nextLine();

String[] words = text.split(«, «);
for(String phrase : words){
System.out.println(phrase);
}

String regex = «[^\d]+»;

int summ = 0;
String[] reg = text.split(regex);

for(String word : reg){
try {
Integer rez = new Integer(word);
summ = summ + rez;
} catch (NumberFormatException e) {
//System.err.println(«Неправильный формат строки!»);
}
}
System.out.println(«Сумма всех зарплат: » + summ);
}

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

public class tt {
private static Object result;

public static void main(String[] args) throws IOException {
BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
String[] s = r.readLine().split(» «);

int A = Integer.parseInt(s[0]);
int B = Integer.parseInt(s[1]);
System.out.println(A+B);
}

}

В программе на языке программирования Python сумму цифр содержащихся в строке с помощью функции sum, поэтому сначала потребуется преобразовать строку в последовательность чисел.

Каждый символ строки преобразуется в число (функцией map с параметром функции преобразования в виде анонимной функции преобразующей цифры в числа, а остальные символы в число 0)

для определения является ли символ цифрой удобно использовать метод строки isdigit

В этом случае анонимная функция имеет вид:

lambda x:int(x) if x.isdigit() else 0

вычислить сумму цифр строки s можно используя выражение:

sum(map(lambda x:int(x) if x.isdigit() else 0,s))

Пример выполнения в оболочке Python:

Понравилась статья? Поделить с друзьями:
  • Как составить досудебное мировое соглашение
  • Как найти поверхностную плотность заряда через потенциал
  • Как найти собственника земельного участка в деревне
  • The saboteur как найти танк волк
  • Как найти индекс постоянного состава