2017-10-13 71 views
1

我想将一个十进制转换为二进制转换器,但是,我注意到有些值被忽略,最后一个值没有被输入到我创建的列表中。Python:为什么while循环排除第一个值?

#Here we create a new empty list. 
binary = [] 
n = int(input("Enter number: ")) 

while n > 1: 
    n = n//2 
    m = n%2 
    binary.append(m) 

binary.reverse() 
print(" ".join(repr(e) for e in binary)) 
+0

你的条件是'N> 1'。当n是1时会发生什么? – user2357112

+0

如果您打算使用相同的除数来执行除法和模运算,则可以通过使用'divmod'函数一次获得两者来略微提高性能。 – Blckknght

+0

@Blckknght'divmod'没有那么快,它涉及一个函数调用,它通常比使用运算符要慢。但确切的速度差异相当小,并且在不同版本之间有所不同。 –

回答

0

你的算法是接近的,但是你需要保存之前剩余你执行除法。而且您还需要更改while条件,并在n的输入值为零时执行特殊处理。

我修复了您的代码&将其置于循环中,以便于测试。

for n in range(16): 
    old_n = n 
    #Here we create a new empty list. 
    binary = [] 
    while n: 
     m = n % 2 
     n = n // 2 
     binary.append(m) 

    # If the binary list is empty, the original n must have been zero 
    if not binary: 
     binary.append(0) 

    binary.reverse() 
    print(old_n, " ".join(repr(e) for e in binary)) 

输出

0 0 
1 1 
2 1 0 
3 1 1 
4 1 0 0 
5 1 0 1 
6 1 1 0 
7 1 1 1 
8 1 0 0 0 
9 1 0 0 1 
10 1 0 1 0 
11 1 0 1 1 
12 1 1 0 0 
13 1 1 0 1 
14 1 1 1 0 
15 1 1 1 1 

由于Blckknght在评论中提到,有,可以给你的商和余一步到位的标准功能

n, m = divmod(n, 2) 

它可以很方便,但它并没有真正提供很多好处从使代码更具可读性。另一种选择是使用一个元组任务并行执行的操作:

n, m = n // 2, n % 2 

这是一个很好的做法,尤其是当你是新的编码,通过你的算法工作在纸上来感受因为它在做什么。如果你的代码没有给出预期的输出,最好在战略地点添加几个print调用来检查变量的值是否是你期望的值。或者学习使用适当的调试器。 ;)

+1

谢谢!我仍然是编程的新手,我正在尽可能地学习。这帮了我很多! – codeHunter

1

这是你的代码修正后:

binary = [] 
n = int(input("Enter number: ")) 
while n > 0: 
    m = n%2 
    n = n//2 
    binary.append(m) 
if len(binary)==0: 
    binary.append(0) 
binary.reverse() 
print(" ".join(repr(e) for e in binary)) 

你的问题是重复这个stackoverflow question检查链接了。

好运:)

1
n = int(input("Enter number: ")) 

print("{0:0b}".format(n)) # one-line alternate solution 

if n == 0:      # original code with bugs fixed 
    binary = [0] 
else: 
    binary = [] 
    while n > 0: 
     m = n%2 
     n = n//2 
     binary.append(m) 
    binary.reverse() 
print("".join(repr(e) for e in binary)) 
1

由于PM 2Ring提出了一个元组的分配可能是要走的路。使你的代码更短也:-) ...也发生了变化N> 1N> = 1

binary = [] 
n = int(input("Enter number: ")) 
while n >= 1: 
    n, m = n // 2, n % 2 
    binary.append(m) 
binary.reverse() 
print(" ".join(repr(e) for e in binary)) 
+0

效率稍高一点:'n,m = divmod(n,2)' – VPfB