【问题标题】:Square Of A Very Large Number非常大数的平方
【发布时间】:2014-03-29 10:45:19
【问题描述】:

给定一个 16 位的整数。我必须使用位操作或 c++ 中的任何其他方法打印它的平方。我试图将数字作为 long int 但它不起作用,因为 long int 的范围更小比所需的输入。

【问题讨论】:

  • 尝试将其转换为浮点数:double d = (double)i?然后位操作会更棘手,但那里有很多材料。否则,如果您使用 gcc,则可以使用 128 bit integers
  • 如果您需要大量空间,您可以随时使用long long i = d*d
  • 如果这还不够,请使用两个 128b 整数并手动将位从一个转移到另一个。在这里查看类似的问题,例如this one
  • 16 位数字的平方最多可以有 32 位。我认为没有任何内置类型可以处理这个问题。

标签: c++


【解决方案1】:

您始终可以选择更大的原始数据类型,但这通常只会延迟问题。真的,一旦你想拿一个长长的正方形,你应该怎么做?

如果您需要非常大的数字,则需要更抽象、更封装的数据表示。 C++ 为这项工作提供了合适的工具,Boost 库通过Boost.Multiprecision 广泛使用它们。具体来说,请查看<boost/multiprecision/cpp_int.hpp> 的文档。它很复杂,但功能强大。

【讨论】:

    【解决方案2】:

    正方形可以完美地表示为无符号整数(32 位):

    #include <iostream>
    #include <cstdint>
    
    int main()
    {
        std::int32_t s = (std::int32_t(1) << 16) - 1;
        std::uint32_t u = std::abs(s);
        std::uint32_t square = u * u;
        std::cout << square << " = " << std::hex << square << '\n';
        return 0;
    }
    

    拥有一个有符号整数,您将面临溢出并得到一个负数。

    【讨论】:

    • 我不认为他的意思是 16 位整数。我认为他的意思是 16 位十进制数字(我自己在这里有点不确定)。
    • abs 的意义何在?这个平方不适合 int32_t 的有符号 16 位数字是什么?
    • 确实@Jens 我正在寻找 16 位小数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 2016-01-18
    相关资源
    最近更新 更多