【发布时间】:2016-10-04 13:40:49
【问题描述】:
冒着这个问题被投票为重复,甚至被关闭的风险,我提出了这个问题。
背景
在 int、long long 等“普通”数据类型中,要将二进制数值转换为十进制字符串,您需要执行以下操作(在伪代码中):
Set length = 0
Set divisor to largest base10 value the data type will hold (Divisor).
Loop
Divide number in question by divisor.
Place result in a string at position length.
Increment the length by 1.
Divide the divisor by 10.
Reverse the string.
Print the string.
(大多数)任何语言的实际实现都非常简单。
问题
我在使用上述方法时遇到的问题是,对于大整数(也称为任意精度算术),没有最大的以 10 为底的值开始。所以问题是“如果无法知道该值是什么,如何将除数初始化为最大可能的 base10 值?”
我的尝试
仍在尝试起草解决方案。
研究
我在这里找到的一些链接包括以下内容:
C: print a BigInteger in base 10
Fastest way to convert a BigInteger to a decimal (Base 10) string?
谷歌搜索发现了其他东西,但没有什么能具体回答我的问题。
想法
我认为可能工作的一种方法如下(在伪代码中):
Define p_divisor as previous divisor.
Set divisor = 1
Loop:
if divisor < dividend
then
Set p_divisor = divisor
divisor = divisor * 10
else
end loop
Loop:
Divide number in question by divisor.
Place result in a string at position length.
Increment the length by 1.
Divide the divisor by 10.
if divisor == 1 then end loop
Reverse the string.
Print the string.
这是正确的方法吗?我有一个大型整数库正在运行(包括乘法和除法),因此实现它并不难。我看到这种方法的最大问题是性能,因为你必须运行一个乘法序列来获得初始除数,然后你必须为每个 base10 位置除两次。一个用于实际除法,另一个用于除数。
【问题讨论】:
-
我会反复除以 10,从右边生成数字。最后,反转字符串。
-
每次除以 10,然后是 100,然后是 1000 等等,而是每次除以 10,并将余数作为下一个数字 - 一直持续到除数为 0。(和要么在末尾反转字符串,要么首先将其反向构建——如果你能弄清楚你的数字中实际使用了多少位,你可以估计你需要的十进制数字的数量密切)。
-
我想你的意思是除以 1000,然后是 100,然后是 10。我想我明白你的意思了。余数是放在字符串中的数字,而结果是新的被除数。这实际上是个好主意。因为除数是 10,高速一字除数算法将把它烧穿一空。此外,由于我从头开始填充字符串,我认为不需要字符串反转步骤。这应该是一个答案,而不是评论。谢谢。
-
第二种方法在 C 中不起作用。因为
if divisor < dividend then Set p_divisor = divisor divisor = divisor * 10将溢出用于大dividend的任何整数类型
标签: c biginteger bigint format-conversion