2017-10-13 6 views
1

私はバイナリコンバータに10進数をしようとしていますが、いくつかの値が無視され、最後の値が作成されたリストに入力されていないことに気付きました。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のとき、どうなるでしょうか? – user2357112

+0

同じ除数で除算とmod演算の両方を行う場合は、 'divmod'関数を使用して両方を一度に取得することで、パフォーマンスを少し向上させることができます。 – Blckknght

+0

@Blckknght 'divmod'はそれほど高速ではなく、一般に演算子を使うよりも遅い関数呼び出しが必要です。しかし、正確な速度の差はかなり小さく、バージョンによって異なります。 –

答えて

0

あなたのアルゴリズムは近いですが、あなたは除算を実行する前に余りを保存する必要があります。また、入力値nがゼロの場合は、whileの条件を変更し、特別な処理を行う必要があります。

私はあなたのコードを固定しました&テストを容易にするためにループに入れました。

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 

それは感触を得るために、紙の上に自分のアルゴリズムを介して動作するために、あなたがコーディングに新しいしている場合は特に、良い習慣ですそれが何をしているのか。また、コードに期待される出力がない場合は、変数の値が期待どおりであることを確認するために戦略的な場所にいくつかの呼び出しを追加することをお勧めします。または、適切なデバッガを使用する方法を学んでください。 ;)

+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> '1'であるn>は1からn> = 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

関連する問題