【问题标题】:How to find the remainder of large number division in C++?如何在 C++ 中找到大数除法的余数?
【发布时间】:2011-01-27 06:14:42
【问题描述】:

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

【问题讨论】:

    标签: modulo


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      或者,试试bignum library

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

      【讨论】:

        【解决方案3】:

        整数的范围仅从 –2,147,483,648 到 2,147,483,647。查看 http://msdn.microsoft.com/en-us/library/s3f49ktz(VS.71).aspx 用于数据类型范围。我推荐长长的。

        【讨论】:

          【解决方案4】:

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

          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 可以支持的最大范围内。

          【讨论】:

            猜你喜欢
            • 2011-10-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-12-06
            • 2015-01-17
            • 1970-01-01
            • 1970-01-01
            • 2016-08-11
            相关资源
            最近更新 更多