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); }
         );