要将数字拆分为给定基数的数字,Julia 有:digits()功能:
julia> digits(36, base = 4)
3-element Array{Int64,1}:
0
1
2
逆向操作是什么?如果你有一个数字数组和基数,是否有一个built-in如何将其转换为数字?我可以将数组打印为字符串并使用parse(),但这听起来效率很低,而且对于碱基 > 10 也不起作用。
前面的答案是正确的,但还有一个效率问题:
sum([x[k]*base^(k-1) for k=1:length(x)])
在求和之前将数字收集到一个数组中,这会导致不必要的分配。跳过括号以获得更好的性能:
sum(x[k]*base^(k-1) for k in 1:length(x))
这还会在求和之前分配一个数组:sum(d.*4 .^(0:(length(d)-1)))
不过,如果您确实想要良好的性能,请编写一个循环并避免重复求幂:
function undigit(d; base=10)
s = zero(eltype(d))
mult = one(eltype(d))
for val in d
s += val * mult
mult *= base
end
return s
end
这有一个额外的不必要的乘法,你可以尝试找出某种方法来跳过它。但在我的测试中,性能比其他方法好 10-15 倍,并且分配为零。
Edit:上面的类型处理实际上存在轻微的风险。如果输入向量和base
有不同的整数类型,可以得到类型的不稳定性。这段代码应该表现得更好:
function undigits(d; base=10)
(s, b) = promote(zero(eltype(d)), base)
mult = one(s)
for val in d
s += val * mult
mult *= b
end
return s
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)