[英]Algorithm for printing decimal value of a huge(over 128bits) binary number?
TLDR,在底部:)
简介:我正在创建一个基本的算术库(加法,减法,...)来处理大数字。 我面临的一个问题是将这些巨大的二进制数字打印成十进制数。
我有一个巨大的二进制数存储在uint64_t数组中。 例如
uint64_t a[64] = {0};
现在,目标是在控制台/文件中打印64 * 64位二进制数作为其十进制值。
初步工作:详细说明问题我想描述我如何打印十六进制值。
int i;
int s = 1;
a[1] = (uint64_t)0xFF;
for(i = s; i>= 0; i--)
{
printf("0x%08llX, ", a[i]);
}
输出:
0x000000FF, 0x00000000,
类似地,对于打印OCT值,我可以从[64]中取出LSB 3位,打印那些位的十进制等效值,3位右移[a]的所有位并继续重复直到a [64]的所有值都有已被打印。 (以反转顺序打印以保持右侧的第一个十进制数字)
我可以通过重复这个单位算法来打印无限大小二进制的十六进制和十月值,但我找不到/开发一个十进制数,我可以一遍又一遍地重复打印[64](或更大的东西)。
我所想到的:我最初的想法是不断减去
max_64 =(uint64)10000000000000000000; //(i.e.10^19)
的10内部uint64_t中最大的倍数,从a
直到内的值a
比max_64(这基本上等效的较小rem_64 = a%max_64
),并使用打印rem_64值
printf("%019llu",rem_64);
这是数字a
19位十进制数字。
然后做一个类似于(不是代码)的算术运算:
a = a/max_64; /* Integer division(no fractional part) to remove right most 19 dec digits from 'a' */
并不断重复和打印19位十进制数字。 (以这样的方式打印,首先找到19位数字在右边,然后是左边的19位数字,依此类推......)。
问题是这个过程很长,我不想使用所有这些来打印dec值。 并且正在寻找一种避免使用这些耗时的算术运算的过程。
我认为必须有一种方法可以通过重复算法来打印巨大的尺寸(类似于Hex和Oct的打印方式),我希望有人可以指出我正确的方向。
我的图书馆可以做什么(到目前为止):
如果需要,我会为其他操作编写代码,但如果可能的话,我想实现独立于库的打印功能。
考虑这样的问题:你得到了一个n位的二进制数X(1 <= n <= 64 * 64)你必须以十进制打印出X. 如果绝对需要,您可以使用现有库,但如果未使用则更好。
TLDR:任何代码,参考或单位算法,我可以重复打印太大和/或未知大小的二进制的十进制值将是非常有帮助的。 强调算法,即如果有人可以描述一个我将能够实现它的过程,我就不需要代码。 提前致谢。
面对这样的疑虑,并且考虑到有很多bigint库,看看他们的代码是很有趣的。 我看了一下Java的BigInteger,它有一个toString
方法,它们做了两件事:
对于小数字,他们咬紧牙关并做一些类似于你提出的建议 - 直接逐链接的基本转换,在每一步输出十进制数。
对于大数字,他们使用递归Schönhage算法 ,他们在评论中引用,在其他地方引用,
Knuth,唐纳德, 计算机编程艺术 ,卷。 2,练习答案(4.4)问题14。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.