【发布时间】:2011-01-27 06:14:42
【问题描述】:
我对 C++ 中的模数有疑问。我试图做的是划分一个非常大的数字,例如,M % 2,其中 M = 54,302,495,302,423。但是,当我去编译时,它说这个数字对于 int 来说是“长”的。然后,当我将其切换为双精度时,它会重复相同的错误消息。有没有办法可以做到这一点,我可以得到这个非常大的数字的剩余部分,或者可能更大的数字?感谢您的帮助,非常感谢。
【问题讨论】:
标签: modulo
我对 C++ 中的模数有疑问。我试图做的是划分一个非常大的数字,例如,M % 2,其中 M = 54,302,495,302,423。但是,当我去编译时,它说这个数字对于 int 来说是“长”的。然后,当我将其切换为双精度时,它会重复相同的错误消息。有没有办法可以做到这一点,我可以得到这个非常大的数字的剩余部分,或者可能更大的数字?感谢您的帮助,非常感谢。
【问题讨论】:
标签: modulo
您可以尝试将数字存储在“long long”(64 位整数值)中,请注意,如果您的应用程序是多线程的并在 32 位 CPU 上运行,则在读取时需要在线程之间进行同步/写入此值,因为读取/写入需要 2 个时钟周期。
或者,试试bignum library
如果你想让事情变得有趣,如果你只做模 2,你可以检查最低位并得到答案。如果您只做模 255,您可以取最低的 8(无符号字符)位并对它们进行操作。如果您只做模 65535,您可以取最低 16 位(无符号短)并对它们进行运算。
【讨论】:
整数的范围仅从 –2,147,483,648 到 2,147,483,647。查看 http://msdn.microsoft.com/en-us/library/s3f49ktz(VS.71).aspx 用于数据类型范围。我推荐长长的。
【讨论】:
提示:使用链表。将数字动态存储为一组数字。例如:
112233445566778899001122 => 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 可以支持的最大范围内。
【讨论】: