为什么 std::accumulate 生成 705032704 作为输出而不是向量中元素的总和?
Why does std::accumulate generate 705032704 as output instead of the sum of the elements in the vector?
输出是 705032704 而不是 5000000000。这是为什么?我以为 std::accumulate
会计算向量中元素的总和。
#include <vector>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <string>
#include <iterator>
#include <queue>
#include <stack>
#include <numeric>
typedef long long ll;
int main()
{
std::vector<ll> nums = {1000000000, 1000000000,1000000000,1000000000,1000000000};
std::cout << std::accumulate(nums.begin(), nums.end(), 0);
std::cin.ignore();
}
你的总和不是 long long
,而是 int
,试试这个
#include <vector>
#include <algorithm>
#include <iostream>
#include <numeric>
int main()
{
std::vector<ll> nums = {1000000000, 1000000000,1000000000,1000000000,1000000000};
std::cout << std::accumulate(nums.begin(), nums.end(), 0ll);
std::cin.ignore();
}
整数溢出。
std::accumulate
从第三个参数的类型推断求和变量的类型。因为你传入一个整数,所以std::accumulate
的结果也是一个整数。
改为传递 long long
文字(来自 C++11):
std::accumulate(nums.begin(), nums.end(), 0LL);
标准算法std::accumulate
声明如下
template<class InputIterator, class T>
T accumulate(InputIterator first, InputIterator last, T init);
所以模板参数T
被用作累加器的类型。
在本次通话中
std::accumulate(nums.begin(), nums.end(), 0)
参数 T 的推导类型为 int
,因为整数文字 0
的类型为 int
。结果,int
.
类型的累加器中存储的总和发生溢出
您必须至少使用 long long 整数文字 0ll
as
std::accumulate(nums.begin(), nums.end(), 0ll
)
或者使用双浮动文字可能是合理的
std::accumulate(nums.begin(), nums.end(), 0.0 )
这是一个演示程序
#include <iostream>
#include <vector>
#include <iterator>
#include <numeric>
using ll = long long int;
int main()
{
std::vector<ll> nums = {1000000000, 1000000000,1000000000,1000000000,1000000000};
std::cout << std::accumulate( std::begin( nums ), std::end( nums ), 0ll ) << '\n';
std::cout << std::accumulate( std::begin( nums ), std::end( nums ), 0.0 ) << '\n';
}
它的输出是
5000000000
5e+09
输出是 705032704 而不是 5000000000。这是为什么?我以为 std::accumulate
会计算向量中元素的总和。
#include <vector>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <string>
#include <iterator>
#include <queue>
#include <stack>
#include <numeric>
typedef long long ll;
int main()
{
std::vector<ll> nums = {1000000000, 1000000000,1000000000,1000000000,1000000000};
std::cout << std::accumulate(nums.begin(), nums.end(), 0);
std::cin.ignore();
}
你的总和不是 long long
,而是 int
,试试这个
#include <vector>
#include <algorithm>
#include <iostream>
#include <numeric>
int main()
{
std::vector<ll> nums = {1000000000, 1000000000,1000000000,1000000000,1000000000};
std::cout << std::accumulate(nums.begin(), nums.end(), 0ll);
std::cin.ignore();
}
整数溢出。
std::accumulate
从第三个参数的类型推断求和变量的类型。因为你传入一个整数,所以std::accumulate
的结果也是一个整数。
改为传递 long long
文字(来自 C++11):
std::accumulate(nums.begin(), nums.end(), 0LL);
标准算法std::accumulate
声明如下
template<class InputIterator, class T>
T accumulate(InputIterator first, InputIterator last, T init);
所以模板参数T
被用作累加器的类型。
在本次通话中
std::accumulate(nums.begin(), nums.end(), 0)
参数 T 的推导类型为 int
,因为整数文字 0
的类型为 int
。结果,int
.
您必须至少使用 long long 整数文字 0ll
as
std::accumulate(nums.begin(), nums.end(), 0ll
)
或者使用双浮动文字可能是合理的
std::accumulate(nums.begin(), nums.end(), 0.0 )
这是一个演示程序
#include <iostream>
#include <vector>
#include <iterator>
#include <numeric>
using ll = long long int;
int main()
{
std::vector<ll> nums = {1000000000, 1000000000,1000000000,1000000000,1000000000};
std::cout << std::accumulate( std::begin( nums ), std::end( nums ), 0ll ) << '\n';
std::cout << std::accumulate( std::begin( nums ), std::end( nums ), 0.0 ) << '\n';
}
它的输出是
5000000000
5e+09