在Python中将十进制转换为三进制(base3)

qncylg1j  于 2023-04-10  发布在  Python
关注(0)|答案(4)|浏览(385)

我试图在一个python函数中将一个十进制数变成三进制。我的想法是不断除法直到商和余数相等,但我似乎无法做到这一点。下面是我的代码:

l = 1

#problem code
def ternary(n):
    e = n/3
    q = n%3
    e= n/3
    q= e%3
    print q

r = input("What number should I convert?: ")
k = bin(r)
v = hex(r)
i = oct(r)
print k+"(Binary)"
print v+"(Hex)"
print i+"(Octals)"
ternary(r)
l+=1
# Variables:
#l,r,k,v,i 
#n,q,e
qlfbtfca

qlfbtfca1#

我的想法是继续除法直到商和余数相等,但我似乎不能让它工作。
是的,差不多是这样。本质上,你想继续除以3,然后收集余数。余数然后组成最终的数字。在Python中,你可以使用divmod来除法和收集余数。

def ternary (n):
    if n == 0:
        return '0'
    nums = []
    while n:
        n, r = divmod(n, 3)
        nums.append(str(r))
    return ''.join(reversed(nums))

示例:

>>> ternary(0)
'0'
>>> ternary(1)
'1'
>>> ternary(2)
'2'
>>> ternary(3)
'10'
>>> ternary(12)
'110'
>>> ternary(22)
'211'
qc6wkl3g

qc6wkl3g2#

你也可以使用NumPy的实现:https://numpy.org/doc/stable/reference/generated/numpy.base_repr.html?highlight=base_repr#numpy.base_repr
不过,我同意专门用于三进制的函数更快。

import numpy as np

number=100 # decimal
ternary=np.base_repr(number,base=3)
print(ternary)
#10201
w3nuxt5m

w3nuxt5m3#

这也可以通过递归来实现。

def ternary(n):
    e = n//3
    q = n%3
    if n == 0:
        return '0'
    elif e == 0:
        return str(q)
    else:
        return ternary(e) + str(q)

更一般地说,您可以使用以下递归函数转换为任何基b(其中2<=b<=10)。

def baseb(n, b):
    e = n//b
    q = n%b
    if n == 0:
        return '0'
    elif e == 0:
        return str(q)
    else:
        return baseb(e, b) + str(q)
enxuqcxy

enxuqcxy4#

下面是一个非递归的解决方案。它返回一个小端整数数组,并且适用于任何自然数值和任何自然数基数≥2。

def base(b,n):
    size = math.ceil(math.log(max(1,n),b))
    return [place
        for i in range(size,-1,-1)
        if (place := n%b**(i+1)//b**i)>0 or i<size] or [0]

最后一个if语句可以省略,如果你不介意偶尔的零填充答案,如[0,1,0,0,0]。
下面是它的用法示例:

>>>base(3,7)
[2,1]

以下是它的逆:

def debase(b,x):
    return sum([xi*b**i 
        for i,xi in enumerate(reversed(x))])

下面是对其行为的测试:

assert all([
    debase(b,base(b,n))==n
    for b in range(2,16+1)
    for n in range(0,1024+1)])

相关问题