Collatz SPOJ - python - 出现NZEC错误
编辑:嘿,我找到了答案。下面是正确的代码。正如答案中所说,我应该把代码放在一个try/except块里。 我正在尝试解决SPOJ网站上的“3n+1”问题,也叫做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
我做了一个改动,处理了换行符的问题。但还是出现了错误 :( 请告诉我我哪里出错了 :(
3 个回答
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']。你可以用这个来读取输入数据。
0
我到现在为止找到的最好方法就是这个
import sys
for k in sys.stdin:
k = int(k)
if k==1:
print k
#.... rest of the code
希望这对你有帮助
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上的题目通常不允许使用简单的方法。