编辑:嘿,我得到了答案。正确的代码写在下面。正如答案所写,我应该将代码保存在try / except块中 我想在SPOJ网站上解决“3n + 1”a.k.a Collatz猜想问题。 http://www.spoj.pl/problems/CLTZ/。以下是我写的代码: 编辑
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
我做了改变,负责换行符。它仍然给出一个错误:( 请让我知道我哪里错了:(
答案 0 :(得分:1)
在输入结束时,您读取一个空行,将其转换为int
会引发异常。当读取行为空时,只需将代码包装在循环的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问题很少允许天真的方法。
答案 1 :(得分:0)
由于C语言在输入时对白色空间不敏感,因此SPOJ中的测试用例有时会包含额外的空格。这是对SPOJ问题采取输入(避免NZEC)的一种通用方法。
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']。然后,您可以使用它来读取输入数据。