在 C++ 中添加一组数字
Add a set of numbers in C++
我知道我可以先将数字存储在数组中,例如 arr[] = {1,2,3};
然后调用 sum 函数将所有数字相加,如 sum(arr);
但是如果我不想使用 arr[] 而只是调用 sum(1,2,3) 怎么办?
值将由用户决定,因此可以是 sum(1,2)、sum(1,2,3,4,5) 或 sum(1,2,5)
#include <iostream>
#include <math.h>
using namespace std;
int addition (int arr[]) {
int length = log2(*(&arr + 1) - arr);
int res = 0;
for (int n=0; n<length + 1; n++){
res += arr[n];
}
cout << res << endl;
return 0;
}
int main ()
{
int array[] = {5, 10, 15,20};
int array1[] = {10,15,20,25,30};
addition (array);
addition (array1);
return 0;
}
你可以这样写函数:
template<typename ...Ts>
auto sum(Ts ...ts)
{
int arr[]{ ts... };
addition(arr);
}
将可变参数存储到一个数组中,并在该数组上调用 addition
。
这里是 demo。
不过,你也可以简单地这样写sum
:
template<typename ...Ts>
auto sum(Ts ...ts)
{
return (ts + ...);
}
这是一个 demo。
此外,如果您使用 std::vector
而不是数组,您可以这样写 addition
:
void addition (std::vector<int> const & v) {
std::cout << std::accumulate(v.begin(), v.end(), 0) << "\n";
}
这是 demo。请注意,您也可以将 accumulate
与数组一起使用,但函数必须是模板,如下所示:
template<int N>
void addition (int const (&arr)[N]) {
std::cout << std::accumulate(arr, arr + N, 0) << "\n";
}
这是一个 demo。
另一种选择是使用字符串流来处理该过程。我想 @cigien 的可变参数模板方法会更有效率,但字符串流在很多方面都非常有用:
#include <sstream>
#include <iostream>
int ssum(std::stringstream &obj) {
int accumulator = 0;
std::string buffer;
while (obj >> buffer) { //read the stream number by number
accumulator += stoi(buffer); //convert to int and add
}
return accumulator;
}
int main() {
int arr[] = {1,2,3,4,5,6,7,8,9,10};
std::stringstream os;
for (auto i : arr) { //feed the array into the stream obj
os << i << " ";
}
std::cout << ssum(os) << std::endl;
return 0;
}
[编辑删除字符串转换步骤,直接传递stringstream对象]
我知道我可以先将数字存储在数组中,例如 arr[] = {1,2,3}; 然后调用 sum 函数将所有数字相加,如 sum(arr);
但是如果我不想使用 arr[] 而只是调用 sum(1,2,3) 怎么办?
值将由用户决定,因此可以是 sum(1,2)、sum(1,2,3,4,5) 或 sum(1,2,5)
#include <iostream>
#include <math.h>
using namespace std;
int addition (int arr[]) {
int length = log2(*(&arr + 1) - arr);
int res = 0;
for (int n=0; n<length + 1; n++){
res += arr[n];
}
cout << res << endl;
return 0;
}
int main ()
{
int array[] = {5, 10, 15,20};
int array1[] = {10,15,20,25,30};
addition (array);
addition (array1);
return 0;
}
你可以这样写函数:
template<typename ...Ts>
auto sum(Ts ...ts)
{
int arr[]{ ts... };
addition(arr);
}
将可变参数存储到一个数组中,并在该数组上调用 addition
。
这里是 demo。
不过,你也可以简单地这样写sum
:
template<typename ...Ts>
auto sum(Ts ...ts)
{
return (ts + ...);
}
这是一个 demo。
此外,如果您使用 std::vector
而不是数组,您可以这样写 addition
:
void addition (std::vector<int> const & v) {
std::cout << std::accumulate(v.begin(), v.end(), 0) << "\n";
}
这是 demo。请注意,您也可以将 accumulate
与数组一起使用,但函数必须是模板,如下所示:
template<int N>
void addition (int const (&arr)[N]) {
std::cout << std::accumulate(arr, arr + N, 0) << "\n";
}
这是一个 demo。
另一种选择是使用字符串流来处理该过程。我想 @cigien 的可变参数模板方法会更有效率,但字符串流在很多方面都非常有用:
#include <sstream>
#include <iostream>
int ssum(std::stringstream &obj) {
int accumulator = 0;
std::string buffer;
while (obj >> buffer) { //read the stream number by number
accumulator += stoi(buffer); //convert to int and add
}
return accumulator;
}
int main() {
int arr[] = {1,2,3,4,5,6,7,8,9,10};
std::stringstream os;
for (auto i : arr) { //feed the array into the stream obj
os << i << " ";
}
std::cout << ssum(os) << std::endl;
return 0;
}
[编辑删除字符串转换步骤,直接传递stringstream对象]