2014-11-15 1 views
11

Вместо того, чтобы вводитьКак добавить все числа в массив в C++?

array[0] + array[1] //.....(and so on) 

есть способ, чтобы сложить все числа в массиве? Язык, который я использую, будет C++. Я хочу, чтобы это было возможно с меньшим набором текста, чем если бы я просто набрал все это.

+6

'станд :: accumulate' делает только то, что он говорит на олове, что одна из причин, чтобы использовать его в течение цикла. – chris

+0

Для векторов: http://stackoverflow.com/questions/3221812/sum-of-elements-in-a-stdvector –

ответ

4

Попробуйте это:

int array[] = {3, 2, 1, 4}; 
int sum = 0; 

for (int i = 0; i < 4; i++) { 
    sum = sum + array[i]; 
} 
std::cout << sum << std::endl; 
+4

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

3

Самый простой способ, который я вижу, это использовать цикл. Бонус заключается в том, что вы можете использовать его на любом целочисленном массиве, не переписывая много кода вообще. Я использую Java чаще, так что я надеюсь, что не слишком много синтаксических ошибок, но что-то, как это должно работать:

int addArray(int[] array, int length){ 
    int sum=0; 
    for(int count=0;count<length;count++){ 
     sum+=array[count]; 
    } 
    return sum; 
} 
+0

Для C++ «int [] array» должен быть «int * array». В противном случае он работает нормально. Вы можете добавить, что вы создаете функцию, которая использует цикл, поэтому в будущем они могут просто вызвать addArray() – Scooter

+0

@Scooter. Эти два эквивалента компилятору в этом контексте. – chris

+0

@chris Посмотрите ближе. Они делают это способом Java - «int [] array» - not «int array []». Но да, я должен был использовать «int array []», поскольку он более ясен, чем «int * array». – Scooter

9

Скажем, у вас есть int array[N].

Вы можете просто сделать:

int sum = 0; 
for(auto& num : array) 
    sum += num; 
+0

Так много чище, чем накапливаться, если у вас есть поддержка на C++ 11 и не требует двух дополнительных включений. – jbo5112

+0

И, используя короткие имена переменных, это гольф лучше, чем накапливать (даже без учета включений). Единственное преимущество накопления - это самодокументирование, я думаю? –

+2

@Ciro: Это не единственное преимущество накопления. Если у вас есть 'int array [100];' и вы сортируете его часть, как этот 'sort (a, a + n);', решение с накоплением позволяет мне создать однострочное красивое суммирование: 'int income = накапливаются (a, a + min (m, n), 0); '. Вы можете найти код, где я использовал его здесь: [codeforces.com - Sereja and Coat Rack] (http://codeforces.com/contest/368/submission/12620328) – Pixar

30

Вот идиоматических способ сделать это в C++:

int a[] = {1, 3, 5, 7, 9}; 
int total = accumulate(begin(a), end(a), 0, plus<int>()); 

Demo.

+10

Стоит отметить, что добавление по умолчанию. – chris

+2

Также стоит отметить, что для типов, отличных от 'int', третий аргумент должен быть 0 нужного типа, например. 0.0 при суммировании 'double's. –

+0

Я не знаю, почему и когда это изменилось, но мне пришлось «#include ' для этого работать. [Cppreference.com] (http://en.cppreference.com/w/cpp/algorithm/accumulate) подтверждает это. – evertheylen

4

Если вы используете valarray, есть функция член sum() для этого.

#include <iostream>  // std::cout 
#include <valarray>  // std::valarray 

int main() { 
    std::valarray<int> myvalarray(4); 
    myvalarray[0] = 0; 
    myvalarray[1] = 10; 
    myvalarray[2] = 20; 
    myvalarray[3] = 30; 
    std::cout << "The sum is " << myvalarray.sum() << '\n'; 

    return 0; 
} 
0

В C++ 17, можно использовать кратные выражения:

template<typename ...Ts> 
int sum_impl(Ts&& ...a) 
{ 
    return (a + ...); 
} 

Если sum_impl имел постоянное количество параметров, мы могли бы назвать его например:

std::apply(sum_impl, arr); 

предположительно arr - std::array<int, N>. Но так как это VARIADIC, он нуждается в небольшой толчок с хелперов:

using namespace std; 

template <class Array, size_t... I> 
int sum_impl(Array&& a, index_sequence<I...>) 
{ 
     return sum_impl(get<I>(forward<Array>(a))...); 
} 

template <class Array> 
int sum(Array&& a) 
{ 
     return sum_impl(forward<Array>(a), 
         make_index_sequence<tuple_size_v<decay_t<Array>>>{}); 
} 

Поэтому, предполагая, что эти помощники находятся на месте, код будет выглядеть примерно так:

template<typename ...Ts> 
int sum_impl(Ts&& ...a) 
{ 
    return (a + ...); 
} 

int main() 
{ 
    array<int, 10> arr{0,1,2,3,4,5,6,7,8,9}; 
    cout << sum(arr) << "\n"; 
    return 0; 
} 
0

Мы можем использовать определенные пользователем функция.

Код сниппета:

#include<bits/stdc++.h> 
using namespace std; 


int sum(int arr[], int n) 
{ 
    int sum=0; 

    for(int i=0; i<n; i++) 
    { 
     sum += arr[i]; 
    } 
    return sum; 
} 


int main() 
{ 
    int arr[] = {1, 2, 3, 4, 5}; 
    int n = distance(begin(arr), end(arr)); 

    int total = sum(arr,n); 

    printf("%d", total); 

    return 0; 
}