以最佳方式将十进制转换为二进制
converting a decimal into binary in the most optimal way possible
将十进制数转换为二进制形式(即具有最佳时间复杂度(的最佳方法是什么?
通常,要将十进制数转换为二进制,我们会继续将数字除以 2 并存储其余数。但是,如果十进制形式的数字非常大,这将花费很长时间。在这种情况下,时间复杂度将是O(log n(。
所以我想知道除了这个之外,是否有其他方法可以更好地完成我的工作?
问题本质上是使用二进制整数算术计算多项式,因此结果是二进制的。假设
p(x) = a₀xⁿ + a₁xⁿ⁻¹ + ⋯ + aₙ₋₁x + aₙ
现在,如果a₀,a₁,a₂,⋯,aₙ
是数字的十进制数字(每个数字都隐式表示为0到9范围内的二进制数(,并且我们在x=10时计算p(隐式二进制(,那么结果就是十进制数字序列表示的二进制数。
给定系数作为输入的情况下,在单个点上评估多项式的最佳方法是霍纳规则。这相当于以一种易于评估的方式重写 p(x(,如下所示。
p(x) = ((⋯((a₀x + a₁)x + a₂)x + ⋯ )x + aₙ₋₁)x + aₙ
这给出了以下算法。此处的数组 a[] 包含十进制数的数字,从左到右,每个数字表示为 0 到 9 范围内的小整数。从 0 开始索引的数组的伪代码:
toNumber(a[])
const x = 10
total = a[0]
for i = 1 to a.length - 1 do
total *= x //multiply the total by x=10
total += a[i] //add on the next digit
return total
在数字以二进制表示的计算机上运行此代码会给出二进制结果。因为这就是我们在这个星球上所拥有的,这给了你想要的。
如果要获取实际位,现在可以使用高效的二进制操作从已构造的二进制数中获取它们,例如掩码和移位。
其复杂性在位数上是线性的,因为对机器整数的算术运算是恒定时间,并且它每个数字执行两个运算(除了第一个(。这是少量的工作,所以这是非常快的。
如果你需要非常大的数字,大于64位,只需使用某种大整数。如果实施得当,这将降低算术成本。
若要避免在大整数实现需要时尽可能多地使用大整数算术,请将数字数组分解为 19 位的切片,最左侧的切片可能更少。 19 是可以转换为(无符号(64 位整数的最大位数。
将上述每个块转换为二进制,而不使用大整数,并按从左到右的顺序创建这些 64 位值的新数组。这些现在是要在 x=10¹⁹ 处评估的多项式的系数。与上述相同的算法只能用于大整数算术运算,10 替换为 10¹⁹,应在使用前用大整数算术进行评估。
- visual在c++中将十进制数转换为二进制数
- C++十进制到二进制,如何转换
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- C++从二进制转换为十进制数
- 错误 C2679:二进制"<<":未找到采用类型 'std::string_view' 的右侧操作数的运算符(或者没有可接受的转换)
- 我编写了代码将十进制分数转换为其二进制等效数.它编译得很好,但在执行时挂起
- C2678 二进制 '==':未找到采用 'Card' 类型左操作数的运算符(或者没有可接受的转换)
- 如何在 O(n) 中将二进制和转换为二进制
- 我写的 ASCII 到二进制转换器C++向后显示二进制,如何使其正确显示?
- 十进制到二进制转换器 c++
- 在C++中将结构转换和存储为二进制
- 从二进制流中读取时,将双精度变量的地址转换为 char* 意味着什么?
- 如何在C ++中将二进制字符串128位转换为十进制字符串?
- 如何将二进制文件头示例代码 (C++/C#) 转换为 Python?
- 二进制 '==':未找到采用 'Enemy' 类型左侧操作数的运算符(或者没有可接受的转换)
- 将二进制转换为十进制,我如何要求用户仅输入二进制
- QTextStream的操作数到二进制的转换无效
- 在c++中读取和转换二进制数据
- c++转换二进制到十进制从字符串输入
- 计算器转换二进制到浮点值-我做错了什么