我有一个号码n
和m
。它们都非常大并且超出了C ++ long long
的限制。如何准确找到n mod m
?
朴素的n % m
最多只能2^63-1
,并且会在9
获得在线评判。
一次添加n
的一位数并使用% m
适用于小型m
,但速度很慢,而且对于m = 1
的特殊情况没有硬编码,它超过了这么小的m
的时间限制。在线评判得到37
。
那么有一种计算n mod m
的方法,将它们作为字符串吗?
答案 0 :(得分:1)
鉴于m
被限制为小于10! (即3628800)您可以轻松地一次处理n
个数字。
如果n
的数字是d[i]
,其中i
从0变为N-1
(d[0]
是最重要的数字),那么像这工作(伪代码):
R = 0
for i = 0 to N-1
R = (10 * R + d[i]) % m
return R
答案 1 :(得分:0)
处理此问题的一种方法是二进制方法。算法步骤如下:
a = n
班次a
设置为左m > a
m = m - a
m < n
DONE结果为m,则转到步骤1 首先,由于您在字符串中同时包含两个数字,因此从1
和m
左侧查找左侧第一个n
的索引并获取它们的差异将得到必要的数字轮班。
我还没有实现它,但是所有操作都是基本的二进制操作(避免相对昂贵的模数),算法的复杂度是O(N),其中N是数字位数;所以它应该有一个不错的表现。