2016-10-29 46 views
-2

給定一個基數 - integer,n,將其轉換爲二進制(基數2)。然後在n的二進制表示中找到並打印表示連續1的最大數目的基數爲10的整數。 這裏是我寫的這獲取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的字符串作爲有效索引。一個非空字符串是truthy,所以'而x [i]'將繼續爲所有有效的'i'。最後,當你通過列表​​邊界增加'i'時,你會得到異常。迭代迭代的常用方法是:'for x in x:'。由於你比較了一個字符串和一個int,所以'x [i] == 1'將始終爲假。 –

回答

1

while循環增量i的代碼,但是當它已經過去字符串x結束永遠不會檢查。您的測試while x[i]不檢查字符串的結尾,它只是檢查每個字符是否爲空。由於字符串中沒有字符是空的(並且字符串只包含'0''1'),所以您的循環纔會繼續。請注意,字符串'0'不會測試爲False:它是一個完全有效的字符串,其計算結果爲True

如果你想要的結構,而不是使用支票

while i < len(x): 

但它會更Python調整你的代碼,並使用

for c in x: 

看起來在每個字符c字符串x

0

您的情況while x[i]是錯誤的,因爲它永遠不會評估任何字符False。你習慣C的空字符結尾的字符串嗎?

此外,您比較一個strint這裏:

if x[i]==1: 

正確的方式做,這將是一個for-each循環使用:

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) 
相關問題