将多个整数打印为一个任意长的十进制字符串

时间:2012-12-14 12:13:38

标签: c integer integer-arithmetic

假设我有16个64位无符号整数。在执行操作时,我一直小心地将它们放在它们之间。我可以将它们提供给一个方法,将它们全部转换成一个十进制数字的字符串,就像它是一个1024位的二进制数字一样吗?换句话说,是否有可能使一个方法适用于代表一个更大整数的任意数量的整数?

我认为对于有符号整数来说会更困难,因为最重要的是要处理它。我想最重要的整数将是有符号整数,其余的将是无符号的,以表示数字的剩余“部分”。

(这与another question半关联。)

3 个答案:

答案 0 :(得分:4)

您可以使用double dabble algorithm,这可以避免多精度乘法和除法的需要。实际上,Wikipedia页面包含该算法的C实现。

答案 1 :(得分:1)

这有点不清楚。

当然,还有一个诸如

之类的功能
void print_1024bit(uint64_t digits[]);
可以写

来做到这一点。但是,如果你的意思是任何标准库的printf() - 函数族可以做到这一点,那么我认为答案是否定的。

正如您在另一个问题中看到的那样,将二进制数转换为不同的基础 b 的核心是由两个操作组成的:

  • Modulo b ,以找出当前最低有效数字
  • b 划分,以便在生成后删除该数字

当应用直到数字为0时,这将以相反的顺序生成所有数字。

因此,您需要为您的1024位数字实现“模10”和“除以10”。

例如,考虑一下十进制数4711,我们只想为此示例转换为八进制:

  1. 4711%8为7,因此最右边的数字 7
  2. 4711/8是588
  3. 588%8为4,下一个数字为 4
  4. 588/8是73
  5. 73%8 1
  6. 73/8是9
  7. 9%8 1
  8. 8/8是1
  9. 1%8 1
  10. 1/8是0,我们已经完成了。
  11. 因此,从底部向上读取粗体数字,向上读到最右边的数字,我们得出结论:4711 10 = 11147 8 。您可以使用计算器来验证这一点,或者只是相信我。 :)

答案 2 :(得分:0)

当然,这是可能的,但不是非常直截了当。

不是重新发明轮子,重新使用图书馆怎么样?

GNU Multi Precision Arithmetic Library就是这样一种可能性。我自己并不需要这些东西,但它似乎适合你的账单。