2016-10-29 7 views
-2

整数nが与えられている場合、それを2進(2進)に変換します。次に、連続した1の最大数を表す基数10の整数を見つけて、nのバイナリ表現で表示して出力します。 は、ここで私はそれがIndexErrorを取得する:文字列インデックスが範囲外にある

#!/bin/python 
import sys 
k=0 
m=0 
i=0 
n = int(raw_input().strip()) 
x=bin(n)[2:] 
while x[i] : 
    if x[i]==1: 
     m=m+1 
    else : 
     if k<m: 
      k=m 
      m=0 
    i+=1 
print(k) 

私は次のようなエラーに

Traceback (most recent call last): 
File "solution.py", line 9, in <module> 
while x[i] : 
IndexError: string index out of range 
+0

あなたが混在の文字列をしましたおよび整数。 'bin(n)'は文字列を返します。 'x [i]'は有効なインデックスのために長さ1の文字列を返します。空でない文字列は真実であるので、 'x [i]'はすべての有効な 'i'の間、継続します。最後にリストの境界を越えて 'i'をインクリメントすると、例外が発生します。 iterablesを反復する通常の方法は 'for y in x:'です。また、 'x [i] == 1'は常に文字列とintを比較するのでfalseです。 –

答えて

1

あなたのwhileループ刻みiを取得していますために書いたコードですが、それは、文字列xの終わりを越えてしまったときにチェックされません。あなたのテストwhile x[i]は、文字列の終わりをチェックしません。空であれば各文字をチェックするだけです。文字列内の文字は空ではないため(文字列には'0''1'しか含まれていないため)、ループはそのまま続きます。文字列'0'Falseにテストされません。完全に有効な文字列で、Trueと評価されます。あなたがその構造をしたい場合は

、代わりにチェック

while i < len(x): 

に使用しますが、あなたのコードを再構築し、文字列x内の各文字c

for c in x: 

を使用するより多くのニシキヘビだろう。

0

あなたの状態はwhile x[i]で、それは決してFalseと評価されないので間違っています。 Cのヌル終了文字列に慣れていますか?

また、あなたはここでintstrを比較している:

if x[i]==1: 

これを行うための適切な方法がために、各ループを使用することです:

import sys 

k = 0 
m = 0 
i = 0 

n = int(raw_input().strip()) 
x = bin(n)[2:] 

for c in x: 
    if c == '1': 
     m += 1 
    else: 
     if k < m: 
      k = m 
     m = 0 

# check whether the last run is greater than the current maximum 
if k < m: 
    k = m 

print(k) 
関連する問題