2011-12-26 71 views
1

编辑:嘿,我得到了答案。正确的代码写在下面。正如答案所写,我应该保持代码在试图/除了块 我正试图解决在SPOJ网站上的“3n + 1”a.k.a Collat​​z猜想问题。 http://www.spoj.pl/problems/CLTZ/。这是我写的代码:编辑Collat​​z SPOJ-蟒蛇 - 给NZEC错误

import sys,os 
#This is for the Collatz Conjecture problem in SPOJ. 
while 1: 
    try: 
     line = sys.stdin.readline() 
     n=int(line) 
    except: 
     break 
    #print 'Line=',line 

    #n=int(line) 
    if(n==1): 
     print n 
     continue 
    else: 
     count=0 
     while(n!=1): 
      if(n%2==0): 
       n = n/2 
       count=count+1 
      else: 
       n= 3 * n + 1 
       count=count+1 
    print count+1 

我遇到了NZEC错误。我尝试过的一些测试用例如下:

123123 
181 
235 
128 
346 
33 
234 
22 
123 
47 
123 
47 
123 
47 
235 
128 
34 
14 
325 
25 
1234 
133 
123 
47 
125 
109 

我做了一些处理换行符的改变。它仍然给出了一个错误:( 请让我知道我要去哪里错了:(

回答

1

在输入结束时,你读一个空行, try-except或从读线是空的循环break

while 1: 
    line = sys.stdin.readline() 
    if line == "": 
     break 
    n=int(line) 

如果上述方法无效,

while 1: 
    try: 
     line = sys.stdin.readline() 
     n = int(line) 
     #other stuff 
    except: 
     break 

应该摆脱NZEC

但是,可能您需要在时间限制内做更好的事情来解决问题,但SPOJ问题很少允许使用天真的方法。

+0

嘿,我改变了处理换行符。它仍然给出了相同的NZEC的东西:(我也尝试过,如果(不是行):break。但是这也给出了相同的东西 – crazyaboutliv 2011-12-26 19:11:19

+0

'try-except'(现在添加)工作吗? – 2011-12-26 19:26:34

+0

是的,谢谢:)它确实 – crazyaboutliv 2011-12-28 10:59:38

0

我发现到现在最好的办法是这样的

import sys 
for k in sys.stdin: 
k = int(k) 
if k==1: 
    print k 
    #.... rest of the code 

希望这有助于

0

因为像C语言是空白敏感而采取的输入,有时测试用例SPOJ包含额外的空格。以下是采取输入(以避免NZEC)SPOJ问题的一种通用方法。

import sys 
tokenizedInput = sys.stdin.read().split() # Tokenize by white spaces 

例如,如果输入数据是这样的 -

3 
2 4 
5 6 stfas 
abcd 

tokenizedInput将是[ '3', '2', '4', '5', '6', 'stfas','abcd']。然后您可以使用它来读取输入数据。