【发布时间】:2019-08-07 16:12:58
【问题描述】:
给定 1 ≤ N ≤ 1018 和 1 ≤ K ≤ 1018,我该如何操作 N % K2?当 K 接近值 1018 时,K2(分母)超出 unsigned long long int 的范围,因此我无法存储值 K2。
【问题讨论】:
给定 1 ≤ N ≤ 1018 和 1 ≤ K ≤ 1018,我该如何操作 N % K2?当 K 接近值 1018 时,K2(分母)超出 unsigned long long int 的范围,因此我无法存储值 K2。
【问题讨论】:
如果 K2 大于 N 则 N % K2 等于 N。
例子:
253 % 172 = 253 % 289 = 253
假设 64 位 unsigned long long,可以平方而不溢出的最大值为 232 - 1 等于 0xFFFFFFFF(或 4'294'967'295)。
因此您可以简单地拥有以下代码:
unsigned long long compute(unsigned long long n, unsigned long long k)
{
if (k > 0xFFFFFFFF)
{
// k² is bigger than n (require more than 64 bits), so the modulo is n
return n;
}
return n % (k * k);
}
【讨论】:
你真的不需要 bigint 库,因为
uint64_t 计算N % (K*K) 而不会溢出FWIW 在大多数 64 位模式下的现代编译器中也有 128 位类型。 GCC、Clang 和 ICC 称之为 __int128
【讨论】: