Collatz SPOJ - python - 出现NZEC错误

1 投票
3 回答
1491 浏览
提问于 2025-04-17 09:02

编辑:嘿,我找到了答案。下面是正确的代码。正如答案中所说,我应该把代码放在一个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上的题目通常不允许使用简单的方法。

撰写回答