c++ - 带多个操作数的 unsigned long long 加法

标签 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

我想添加 a+b+c+d+e 并得到结果(64 位)进位,因为它会超过 64位。我应该为此使用 BigInteger 库吗?有没有更简单的方法来做这样的事情?我发现的大多数使用 BigInteger 的东西都有点复杂,虽然我的问题看起来很简单,但我找不到非常相似的例子。

最佳答案

如果只需要做加法

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

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

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

关于c++ - 带多个操作数的 unsigned long long 加法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44323624/

相关文章:

java - C/C++ 头文件到 java

c++ - 如何在 Mac OS X 上从命令行进行分析?

c++ - 如何解决虚拟后缀运算符的切片问题?

java - BigInteger CompareTo 与 minus + signnum()

r - 19 位数字不会像在 R 中那样被解析

c++ - ZMQ可以在同一个线程中发布和读取吗?

c++ - 对 main() 中函数的 undefined reference

java - new BigInteger(String) 发出 Sonar 警告

java - 如何将 BigInteger 转换为科学计数法字符串并返回?

math - 查找大整数是否是十的幂的最快方法是什么?