【问题标题】:Inputting Huge Binary Numbers C++输入巨大的二进制数 C++
【发布时间】:2021-02-07 01:43:35
【问题描述】:

所以我正在研究一个有竞争力的编程问题,你需要以 2 和 3 为底的两个数字,然后对它们进行一些运算。我得到了正确实现的代码,但是它不适用于大输入。例如,当我尝试输入 10010111011100101101100011011(基数二)和 211010102022001220(基数三)时。这是因为我将它们作为常规整数输入,然后将它们转换为实际的以 10 为底的值。

这是我的转换函数(仅适用于基数 2 和 3)

int conv(int base, ll n){
int result = 0;
if(base == 2){
    int a = 0;
    while(n > 0){
        if(n % 2 == 1){
            result += pow(2, a);
        }
        a++;
        n /= 10;
    }
    return result;
}
else if(base == 3){
    int a = 0;
    while(n > 0){
        result += (n%10)%3 * pow(3, a);
        a++;
        n /= 10;
    }
    return result;
}
return result;

当我在 conv(2, 1010) 等非常小的数字上运行此函数时,它可以工作;我得到 10(将​​ 1010 base 2 转换为 base 10)

但是,如果我想输入 10010111011100101101100011011(base 2),我的代码似乎不起作用。有没有其他方法可以做到这一点?

【问题讨论】:

  • 10010111011100101101100011011(以 10 为基数)太长,不适合标准 C++ 整数类型。将它们作为字符串读取。
  • 如果函数是基于字符串的,你如何创建它?
  • 与创建任何其他函数的方式相同:为它编写代码,测试它,看看它是否有效,如果不能找出原因,修复它,再试一次,等等。不幸的是,stackoverflow.com 不是 C++ 教程网站。有关如何在 C++ 中做很多事情的更多信息,a good C++ textbook 将是您的最佳资源。

标签: c++ algorithm binary integer base


【解决方案1】:

在 cpp 中处理大 int 有不同的技巧。一般来说,您可以使用 boost cpp_int。

cpp_int 没有[理论上的] 最大值。由于 C++ 可以直接使用指针,因此 C++ 中 cpp_int 的最大大小与指针可以寻址的最大内存范围成正比——在 64 位架构中,通常但不总是 2^64-1;或者换句话说,cpp_int 的最大值是 2^64-1,根据他们实现符号的方式来取舍一个数量级。

【讨论】:

  • 你能解释一下这与这里提出的问题有什么关系吗?甚至与 Python 无关?
  • @SamVarshavchik 显然存在暂时的混乱。答案已被完全替换。我还不相信这是一个好的答案,但至少它与问题相关。
【解决方案2】:

根据您要对 base-2 和 base-3 数字执行的特定操作,仅对字符串值进行操作可能是可行的。优点是你几乎没有界限。

将您的输入数字读取为字符串。编写一个函数来验证给定字符串是否是给定基数中的有效数字。然后编写这些操作来处理字符串。加法和减法很容易,但乘法和除法需要更多的步骤。如果您需要处理三角函数和超越函数,那么这将是一个困难但可行的数学问题。基本上,您希望准确执行您在手动执行操作时所经历的步骤,包括携带和借用。

【讨论】:

    猜你喜欢
    • 2011-11-28
    • 1970-01-01
    • 2017-03-22
    • 2017-05-19
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多