我正在使用C ++进行BigInt实现,而且我很难弄清楚如何从(和)字符串创建转换器(C字符串现在就足够了)。
我将数字实现为unsigned int数组(因此基本上将位块彼此相邻)。我无法弄清楚如何将字符串转换为此表示形式。
例如,如果usigned int为32b,并且我得到一个" 4294967296"或" 5000000000"或者基本上任何大于32b int可以容纳的东西,我如何正确地将其转换为适当的二进制表示?
我知道我错过了一些明显的东西,我只是要求向正确的方向努力。感谢您的帮助,抱歉提出这样一个愚蠢的问题!
答案 0 :(得分:1)
一种方式(不一定最有效)是实现通常的算术运算符,然后执行以下操作:
// (pseudo-code)
// String to BigInt
String s = ...;
BigInt x = 0;
while (!s.empty())
{
x *= 10;
x += s[0] - '0';
s.pop_front();
}
Output(x);
// (pseudo-code)
// BigInt to String
BigInt x = ...;
String s;
while (x > 0)
{
s += '0' + x % 10;
x /= 10;
}
Reverse(s);
Output(s);
如果您想做一些比您尝试以下方法更棘手的事情:
答案 1 :(得分:1)
int
)实施并测试字符串到数字算法。operator+
,operator*
以及上述算法使用的其他内容实施bignum类。使用字符串转换算法来调试类,而不是相反。
另外,我鼓励你尝试高级写作,而不是回到C结构。 C可能更简单,但通常不会使事情变得更容易。
答案 2 :(得分:0)
例如,请参阅Michael Bromberger的MPI中的mp_toradix
和mp_read_radix
。
请注意,重复除以10(在上面使用)执行得非常差,当你有非常大的整数时会显示。这不是“全部而是全部”,但它对于家庭作业来说已经足够好了。
分而治之的方法是可行的。这是要点。例如,给定数字123456789,我们可以将其分成几部分:1234 56789,除以10的幂。(你可以想象这些基数为100,000的两位大数字。现在执行重复除以10是现在这两件便宜了!将1234分为10分三次,将56879分为10分四次,比将123456789除以10分8便宜。
当然,一个非常大的数字可以递归地分成两部分。
Bruno Haibl的CLN(在CLISP中使用)做了类似的事情,与MPI相比,将数千位的数字转换为数字文本的速度非常快。