用于打印巨大(超过128位)二进制数的十进制值的算法?

asi*_*268 5 c algorithm data-conversion

TLDR,在底部:)

简介: 我正在创建一个用于处理大量数字的基本算术库(加法,减法...)。我面临的问题之一是将这些巨大的二进制数打印为十进制。

我在uint64_t数组中存储了巨大的二进制数。例如

uint64_t a[64] = {0};
Run Code Online (Sandbox Code Playgroud)

现在,目标是在控制台/文件中打印64 * 64位二进制数作为其十进制值。

初始工作: 为了阐述这个问题,我想描述如何打印十六进制值。

int i;
int s = 1;
a[1] = (uint64_t)0xFF;
for(i = s; i>= 0; i--)
{
    printf("0x%08llX, ", a[i]);
}
Run Code Online (Sandbox Code Playgroud)

输出:

0x000000FF, 0x00000000, 
Run Code Online (Sandbox Code Playgroud)

同样,对于打印OCT值,我只能从a [64]中取LSB 3位,打印与这些位等效的十进制数,向右移3位a [64]的所有位,并继续重复直到a [64]的所有值都已打印。(以反转顺序打印,以使第一个十进制数字保持在右侧)

我可以通过重复此单位算法来打印大小不受限制的二进制十六进制和十进制值,但是我找不到/开发一个十进制的值,可以重复一遍以打印a [64](或更大的值)。

我想到的是: 我最初的想法是继续减去

max_64 =(uint64)10000000000000000000; //(i.e.10^19)
Run Code Online (Sandbox Code Playgroud)

uint64_t内部最大的10的倍数,a直到内部的值a小于max_64(基本上等于rem_64 = a%max_64),然后使用以下命令打印rem_64值

printf("%019llu",rem_64);
Run Code Online (Sandbox Code Playgroud)

这是数字的第19个十进制数字a

然后执行类似于(不是代码)的算术运算:

a = a/max_64; /* Integer division(no fractional part) to remove right most 19 dec digits from 'a' */
Run Code Online (Sandbox Code Playgroud)

并继续重复并打印19个十进制数字。(以这样的方式打印:首先找到的19位数字在右边,然后在其后的19位数字在左边,依此类推...)。

问题是此过程耗时很长,我不想使用所有这些仅打印dec值。并且正在寻找一种避免使用这些耗时的算术运算的过程。

我相信必须有一种方法,只需重复算法即可打印出大尺寸的纸张(类似于十六进制和十进制的打印方式),我希望有人可以指出正确的方向。

我的图书馆可以做什么(到目前为止):

  • 添加(使用全加器)
  • 减法(使用全减法)
  • 比较(通过比较数组大小和比较数组元素)
  • Div(整数除法,无小数部分)
  • 模量(%)
  • 乘法(基本上是多次加法:()

如果需要,我将为其他操作编写代码,但如果可能,我想独立于库来实现打印功能。

考虑这样的问题: 给您一个n位的二进制数X(1 <= n <= 64 * 64),您必须用十进制打印X。如果绝对需要,您可以使用现有的库,如果未使用,则可以使用现有的库。

TLDR: 我可以重复使用的任何代码,引用或单位算法来打印太大和/或未知大小的二进制十进制值。强调算法,即如果有人可以描述一个过程,那么我将不需要实现代码。提前致谢。

tuc*_*uxi 3

面对这样的疑问,并且考虑到有很多 bigint 库,研究它们的代码很有趣。我看了一下Java的BigInteger,它有一个toString方法,它们做了两件事:

\n\n\n\n
\n

唐纳德·高德纳 (Knuth), 《计算机编程的艺术》,卷。2、习题(4.4)第14题答案。

\n
\n