BigInt实现 - 将字符串转换为二进制表示存储为unsigned int

时间:2012-03-23 01:49:14

标签: c++

我正在使用C ++进行BigInt实现,而且我很难弄清楚如何从(和)字符串创建转换器(C字符串现在就足够了)。

我将数字实现为unsigned int数组(因此基本上将位块彼此相邻)。我无法弄清楚如何将字符串转换为此表示形式。

例如,如果usigned int为32b,并且我得到一个" 4294967296"或" 5000000000"或者基本上任何大于32b int可以容纳的东西,我如何正确地将其转换为适当的二进制表示?

我知道我错过了一些明显的东西,我只是要求向正确的方向努力。感谢您的帮助,抱歉提出这样一个愚蠢的问题!

3 个答案:

答案 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. 如果输入I是< 100使用上述方法。
  2. 按位长* 3/10估算I的D位数。
  3. Mod和除以因子F = 10 ^(D / 2),得到I = X * F + Y;
  4. 以I = X和I = Y
  5. 递归执行

答案 1 :(得分:1)

  1. 使用内置类型(例如int)实施并测试字符串到数字算法。
  2. 使用operator+operator*以及上述算法使用的其他内容实施bignum类。
  3. 现在算法应该与bignum类保持一致。
  4. 使用字符串转换算法来调试类,而不是相反。

    另外,我鼓励你尝试高级写作,而不是回到C结构。 C可能更简单,但通常不会使事情变得更容易。

答案 2 :(得分:0)

例如,请参阅Michael Bromberger的MPI中的mp_toradixmp_read_radix

请注意,重复除以10(在上面使用)执行得非常差,当你有非常大的整数时会显示。这不是“全部而是全部”,但它对于家庭作业来说已经足够好了。

分而治之的方法是可行的。这是要点。例如,给定数字123456789,我们可以将其分成几部分:1234 56789,除以10的幂。(你可以想象这些基数为100,000的两位大数字。现在执行重复除以10是现在这两件便宜了!将1234分为10分三次,将56879分为10分四次,比将123456789除以10分8便宜。

当然,一个非常大的数字可以递归地分成两部分。

Bruno Haibl的CLN(在CLISP中使用)做了类似的事情,与MPI相比,将数千位的数字转换为数字文本的速度非常快。