带多个操作数的 unsigned long long 加法
unsigned long long addition with multiple operands
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
。不过祝你好运...
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
。不过祝你好运...