问题描述
因此,我正在研究一个竞争性编程问题,在该问题中,您需要将两个数字以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以2为基数转换为10)
但是,如果我想使用10010111011100101101100011011(基础2),我的代码似乎不起作用。我还有其他方法可以做到吗?
解决方法
根据要对base-2和base-3数字执行的特定操作,仅对字符串值进行操作可能是可行的。好处是您几乎不受限制。
以字符串形式读取输入数字。编写一个函数,以验证给定的字符串在给定的基数中是否为有效数字。然后编写这些操作以处理字符串。加法和减法很容易,但是乘法和除法还需要更多步骤。如果您需要处理三角函数和先验函数,那么这将是一个困难但可行的数学问题。基本上,您希望完全执行手动执行操作时要执行的步骤,并附带搬运和借用。
,在cpp中处理大整数有不同的技巧。通常,您可以使用boost cpp_int。
cpp_int没有[理论]最大值。由于C ++可以直接使用指针,因此C ++中cpp_int的最大大小与指针可以寻址的最大内存范围成比例-在64位体系结构中,通常但并非总是2 ^ 64-1。换句话说,cpp_int的最大值为2 ^ 64-1,取决于它们实现符号的方式,取或取一个数量级。