我正在尝试获取一个大数的余数,例如:
1551690021432628813 % 64
但我发现对于 JavaScript 来说这几个数字太长了。即它四舍五入为零。
除了使用BigInteger.js这样的 26kb 库之外,还有其他方法可以解决这个问题吗?
您可以将数字分成 10 位数字的块(从右侧开始),并对这些块进行模算术,最后合并结果:
1551690021432628813 = 155169002 * 10**10 + 1432628813
Run Code Online (Sandbox Code Playgroud)
因此
1551690021432628813 % 64 = (155169002 % 64 * (10**10) % 64 + 1432628813 % 64) % 64
Run Code Online (Sandbox Code Playgroud)
(等于13)。
您可以编写一个递归函数来实现这个想法。以下是用 Python 编写的(我更流利),但应该很容易翻译成 JavaScript:
def remainder(s,m):
#computes int(s) % m, while just using small numbers
#s is a string and m is an integer
n = len(s)
if n <= 10:
return int(s) % m
else:
first = s[:n-10] #first n-10 digits in s
second = s[-10:] #last 10 digits
return (remainder(first,m) * ((10**10) % m) + int(second) % m) % m
Run Code Online (Sandbox Code Playgroud)
对于模数为 的特殊情况64,有一个非常简单的方法:64 divides 10**6所以,绝对总是
n % 64 == (last 6 digits of n) % 64
Run Code Online (Sandbox Code Playgroud)
例如,
1551690021432628813 % 64 = 628813 % 64 = 13
Run Code Online (Sandbox Code Playgroud)
只要模数是 2 的幂,类似的说法就成立。