这可能已被问过,但我无法在此论坛上找到它。在对大整数进行算术运算时,我有一个关于c ++中整数运算的一般性问题。
unsigned int value = 500000;
value = (value * value) % 99;
上述代码的正确值为25,但是当在C ++中实现时,我得到的值为90.
我查看了反汇编,这让我有一个小小的想法,为什么它可能会以错误的值返回,反汇编如下
unsigned int value = 500000;
00D760B5 mov dword ptr [value],7A120h
value = ((value * value) % 99);
00D760BC mov eax,dword ptr [value]
00D760BF imul eax,dword ptr [value]
00D760C3 xor edx,edx
00D760C5 mov ecx,63h
00D760CA div eax,ecx
00D760CC mov dword ptr [value],edx
它似乎将它放入一个32位寄存器,这就是为什么结果会出现错误。
然而,我的问题是我如何模仿语言给我正确的答案?我确信有一种简单直接的方法可以做到这一点,但我正在画一个空白。
答案 0 :(得分:3)
您应该考虑使用更大的整数类型,例如unsigned long
或unsigned long long
。在我的机器上,这两个都为您提供了8个字节的工作空间,最大值为18,446,744,073,709,551,615。这足够舒适,足以容纳500000 ^ 2 = 250,000,000,000。
但是,在我看来,这是一个糟糕的解决方案。相反,你应该使用更好的数学。以下模块化身份应该让您按照自己的意愿行事:
(ab) mod n = [(a mod n)(b mod n)] mod n.
在你的情况下,你要写:
unsigned int value = 500000;
value = ((value%99)*(value%99))%99;
答案 1 :(得分:0)
你正在使用的数字真的很大。它有一些其他语言,比如python,它们已经在库中构建,以特殊方式处理真正的大数字,因为单个32位整数不能容纳那么多。 C ++没有这样做,而且随着ForceBru的推出,结果是巨大的,并且给出了溢出错误。
如果你想处理长数,你可以在大整数的系数表示中操纵多项式,或者在线寻找科学计算库。