如何在C ++中找到大数除法的余数?

时间:2010-03-13 21:27:51

标签: modulo

我对C ++中的模数有疑问。我试图做的是划分一个非常大的数字,例如,M%2,其中M = 54,302,495,302,423。但是,当我去编译时,它说int的数字是'long'。然后当我将其切换为double时,它会重复相同的错误消息。有没有办法我可以做到这一点,我将得到这个非常大的数字的剩余部分或可能更大的数字?非常感谢您的帮助。

4 个答案:

答案 0 :(得分:3)

您可以尝试将数字存储在“long long”(64位整数值)中,请注意,如果您的应用程序是多线程的并且在32位CPU上运行,则在读取时需要在线程之间进行同步/写入该值,因为读/写需要2个时钟周期。

或者,尝试bignum library

如果你想让事情变得有趣,如果你只做模2,你可以检查最低位并得到答案。如果你只做模数255,你可以取最低8(无符号字符)位并对它们进行操作。如果你只做模数65535,你可以取最低的16位(无符号短路)并对它们进行操作。

答案 1 :(得分:2)

对于C ++中的大数字运算,请使用GMP库。特别是,mpz_mod函数会执行此操作。

对于更自然的C ++包装器,mpz_class类可以通过为多精度操作提供运算符重载来提供帮助。

答案 2 :(得分:0)

整数范围仅为-2,147,483,648至2,147,483,647。校验 http://msdn.microsoft.com/en-us/library/s3f49ktz(VS.71).aspx表示数据类型范围。我推荐很长一段时间。

答案 3 :(得分:0)

提示:使用链接列表。将数字动态存储为一组数字。例如:

1 12233445566778899001122 => 11223344 55667788 99001122

现在考虑单个单位并从左到右开始。找到提醒并操纵它以添加到下一组并继续。

现在实施非常简单:)

编辑:

112233445566778899001122/6 =>  11223344 55667788 99001122/6


 11223344/6 =>2

 2*100000000 + 55667788 = 255667788
 255667788/6 => 0
 0*100000000 + 99001122 = 99001122
 99001122/6=>0

 So the reminder is 0.

请记住,操作后的单个单元应该在int可以支持的最大范围内。