NZEC在python上用于AP2的spoj

时间:2012-12-21 08:39:47

标签: python-2.7 return return-value

我写了以下两个代码

FCTRL2.py

import sys;
def fact(x):
    res = 1
    for i in range (1,x+1):
        res=res*i
    return res;

t = int(raw_input());
for i in range (0,t):
    print fact(int(raw_input()));

AP2.py

import sys;

t = int(raw_input());
for i in range (0,t):
    x,y,z = map(int,sys.stdin.readline().split())
    n = (2*z)/(x+y)
    d = (y-x)/(n-5)
    a = x-(2*d)
    print n
    for j in range(0,n):
        sys.stdout.write(a+j*d)
        sys.stdout.write(' ')
    print' '

在spoj上接受FCTRL2.py,而AP2.py则给出NZEC错误。两者都可以在我的机器上正常工作,并且我没有发现从两者返回值的差异。请解释两者之间的区别是什么以及如何避免AP2.py

的NZEC错误

2 个答案:

答案 0 :(得分:4)

输入中可能有额外的空格。一个好的问题设定器将确保输入满足指定的格式。但是,由于spoj几乎可以让任何人添加问题,因此有时会出现这样的问题。缓解空白问题的一种方法是立即读取输入,然后对其进行标记。

import sys;   # Why use ';'? It's so non-pythonic.

inp = sys.stdin.read().split()    # Take whitespaces as delimiter
t = int(inp[0])
readAt = 1
for i in range (0,t):
    x,y,z = map(int,inp[readAt:readAt+3])    # Read the next three elements
    n = (2*z)/(x+y)
    d = (y-x)/(n-5)
    a = x-(2*d)
    print n
    #for j in range(0,n):
    #    sys.stdout.write(a+j*d)
    #    sys.stdout.write(' ')
    #print ' '
    print ' '.join([str(a+ti*d) for ti in xrange(n)]) # More compact and faster
    readAt += 3   # Increment the index from which to start the next read

答案 1 :(得分:0)

第10行中的n可以是float,range函数需要一个整数。因此程序退出时有例外。

我在Windows上测试了这个值:

>ap2.py
23
4 7 9
1.6363636363636365
Traceback (most recent call last):
  File "C:\martin\ap2.py", line 10, in <module>
    for j in range(0,n):
TypeError: 'float' object cannot be interpreted as an integer