C++ - 将向量<uint64> 转换为单个数字
C++ - Convert vector<uint64> to a single number
有一种方法可以将 std::vector<uint64>
转换为单个数字吗?
我有一个这样的向量:
v[0] = 0;
v[1] = 6796890219657246832;
或者像这样:
v[0] = 16377;
v[1] = 2631694347470643681;
v[2] = 11730294873282192384;
我希望得到的结果是,在第一种情况下 6796890219657246832
,在第二种情况下:16377263169434747064368111730294873282192384
。我的主要问题是为值选择数据类型,因为向量大小可能并不总是 2,但可能为 5 或更高。
没有任何 C++ 提供的类型支持那么多数字。很明显,为此你需要 BIG-INT。 Ethier 由您自己实现或使用经过测试的库,如 GMP.
例如,使用 GMP 将像:
static mpz_class convert_to_i(std::vector<std::size_t> const& vec)
{
std::string sum;
for (auto const number : vec) {
sum += std::to_string(number);
}
return mpz_class(sum);
}
设vec
为:
std::vector<std::size_t> const vec = {
16377,
2631694347470643681,
1173029487328219238
};
convert_to_i(vec)
的结果将是:
1637726316943474706436811173029487328219238
如果你的原始数字也是大整数:
static mpz_class convert_to_i(std::vector<mpz_class> const& vec)
{
std::string sum;
for (auto const& number : vec) {
sum += number.get_str();
}
return mpz_class(sum);
}
设 vec_2
为:
std::vector<mpz_class> const vec_2 = {
mpz_class("26316943474706436812631694347470643681"),
mpz_class("263169434747064368126316943474706436812631694347470643681")
};
convert_to_i(vec_2)
的结果将是:
26316943474706436812631694347470643681263169434747064368126316943474706436812631694347470643681
仅供 copy/paste 测试:the code.
使用 std::accumulate
并生成一个字符串。
std::string result = std::accumulate (
v.begin(),
v.end(),
std::string(),
[](const std::string &result, const uint64 &val) {
return result + std::to_string(val); }
);
有一种方法可以将 std::vector<uint64>
转换为单个数字吗?
我有一个这样的向量:
v[0] = 0;
v[1] = 6796890219657246832;
或者像这样:
v[0] = 16377;
v[1] = 2631694347470643681;
v[2] = 11730294873282192384;
我希望得到的结果是,在第一种情况下 6796890219657246832
,在第二种情况下:16377263169434747064368111730294873282192384
。我的主要问题是为值选择数据类型,因为向量大小可能并不总是 2,但可能为 5 或更高。
没有任何 C++ 提供的类型支持那么多数字。很明显,为此你需要 BIG-INT。 Ethier 由您自己实现或使用经过测试的库,如 GMP.
例如,使用 GMP 将像:
static mpz_class convert_to_i(std::vector<std::size_t> const& vec)
{
std::string sum;
for (auto const number : vec) {
sum += std::to_string(number);
}
return mpz_class(sum);
}
设vec
为:
std::vector<std::size_t> const vec = {
16377,
2631694347470643681,
1173029487328219238
};
convert_to_i(vec)
的结果将是:
1637726316943474706436811173029487328219238
如果你的原始数字也是大整数:
static mpz_class convert_to_i(std::vector<mpz_class> const& vec)
{
std::string sum;
for (auto const& number : vec) {
sum += number.get_str();
}
return mpz_class(sum);
}
设 vec_2
为:
std::vector<mpz_class> const vec_2 = {
mpz_class("26316943474706436812631694347470643681"),
mpz_class("263169434747064368126316943474706436812631694347470643681")
};
convert_to_i(vec_2)
的结果将是:
26316943474706436812631694347470643681263169434747064368126316943474706436812631694347470643681
仅供 copy/paste 测试:the code.
使用 std::accumulate
并生成一个字符串。
std::string result = std::accumulate (
v.begin(),
v.end(),
std::string(),
[](const std::string &result, const uint64 &val) {
return result + std::to_string(val); }
);