gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 23:53:36 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com