输入巨大的二进制数 C++

Inputting Huge Binary Numbers C++

所以我正在研究一个有竞争力的编程问题,你将两个数字以二为底和以三为底,然后对它们进行一些操作。我正确地实现了代码,但是它不适用于大量输入。例如,当我尝试输入 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 以 2 为底数转换为以 10 为底数)

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

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

cpp_int 没有 [理论] 最大值。由于C++可以直接使用指针,所以C++中cpp_int的最大大小与指针可寻址的最大内存范围成正比——在64位架构中为usually-but-not-always2^64-1;或者换句话说,cpp_int 的最大值是 2^64-1,give-or-take 一个数量级取决于他们如何实现符号。

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

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