带有多个操作数的unsigned long long加法

时间:2017-06-02 07:53:49

标签: c++ biginteger

unsigned long long a = 18446744073709551615
unsigned long long b = 18446744073709551614
unsigned long long c = 18446744073709551613
unsigned long long d = 18446744073709551612
unsigned long long e = 18446744073709551611

我想添加+ b + c + d + e并同时获取结果(64位)进位,因为它&#39 ;超过64位。我应该使用BigInteger库吗?有没有更简单的方法来做这样的事情?我发现使用BigInteger的大多数东西都有点复杂,我找不到非常相似的例子,尽管我的问题似乎很简单。

1 个答案:

答案 0 :(得分:3)

如果您只需要添加

#include<cstdint>
#include<limits>
#include<utility>

using std::uint64_t;

std::pair<uint64_t, int> add_with_carry(uint64_t a, uint64_t b)
{
    if(a > std::numeric_limits<uint64_t>::max() - b)
        return {a + b, 1};
    else
        return {a + b, 0};
}

auto [sum, carry] = add_with_carry(a, b);

并扩展到任意链式添加

std::pair<uint64_t, int> add_with_carry(std::pair<uint64_t, int> a)
{
    return a;
}

template<typename... Addends>
std::pair<uint64_t, int> add_with_carry(std::pair<uint64_t, int> a, uint64_t b, Addends... addends)
{
    if(b > std::numeric_limits<uint64_t>::max() - a.first)
        return add_with_carry(std::pair<uint64_t, int>{b + a.first, 1 + a.second}, addends...);
    else
        return add_with_carry(std::pair<uint64_t, int>{b + a.first, a.second}, addends...);
}

template<typename... Addends>
std::pair<uint64_t, int> add_with_carry(uint64_t a, Addends... addends)
{
    return add_with_carry(std::pair<uint64_t, int>{a, 0}, addends...);
}

auto [sum, carry] = add_with_carry(a, b, c, d, e);

使用折叠表达式可能有一种更优雅的方式来实现它。

警告:如果您在调用int时有20亿个变量,则可能会溢出进位add_with_carry。祝你好运......