所以我正在从SPOJ做一个练习,它是一个简单的计算器。每当我尝试提交答案时,我都会收到NZEC错误,我想知道它是否因为它应该被定义为int32。 这是我的代码:
import sys
n = input()
n = int(n)
i = 0
while n > i:
znak, num1, num2 = input().split()
num1 = int(num1)
num2 = int(num2)
if znak == "+":
b = num1 + num2
print(b)
elif znak == "-":
b = num1 - num2
print(b)
elif znak == "*":
b = num1 * num2
print(b)
elif znak == "/":
b = num1 / num2
print(b)
elif znak == "%":
b = num1 % num2
print(b)
i += 1
sys.exit(0)
我已尝试了一些解决方案"对于这个NZEC错误,但没有任何效果。
答案 0 :(得分:4)
如果结果应为整数,则应使用operator.floordiv
,即a // b
,而不是a / b
1 :
from operator import add, sub, mul, floordiv, mod
op = {'+': add, '-': sub, '*': mul, '/': floordiv, '%': mod}
for i in range(int(input())):
znak, *nums = input().split()
print(op[znak](*map(int, nums)))
顺便说一下,上面的代码与你的完全相同,但它的时间缩短了两倍!
如何?
znak
中,为什么检查if/else
是否等于具有大量op
语句的内容,并通过{获取所需的运算符{1}}?op[znak]
语法将a, *b = iterable
的第一项提取到iterable
中,并将其他项放入列表< / em> a
,看起来超级好看b
是一个接受两个参数的函数,因此您将op[znak]
转换为带有nums
的整数,然后将它们作为单独的参数传递给星号:map(int, nums)
*map(int, nums)
循环索引递增,如果有Pythonic的方法呢?使用while
?range(start, stop, [step])
,因此您可以立即将其插入n
Pssst,伙计,感觉需要一些疯狂?看看如何将所有这些分成两行:
range
或仅一行:
from operator import*
sum(0for _ in map(print,((lambda znak,*nums:{'+':add,'-':sub,'*':mul,'/':floordiv,'%':mod}[znak](*map(int,nums)))(*input().split())for _ in range(int(input())))))
这些与第一个版本完全一样。现在,这只是为了好玩,展示Python的强大功能以及它有多乱。 不要在家里试试:D
1 真正的师与地板师:sum(0for _ in map(print,((lambda znak,*nums:{'+':lambda a,b:a+b,'-':lambda a,b:a-b,'*':lambda a,b:a*b,'/':lambda a,b:a//b,'%':lambda a,b:a%b}[znak](*map(int,nums)))(*input().split())for _ in range(int(input())))))
,但是1 / 10 == 0.1
。
答案 1 :(得分:0)
一个简单的解决方案:我们的想法是将输入包机分成保留订单的令牌。在我们的例子中,令牌是numbers
和[+-/*]
所以使用正则表达式非常简单。 \d+
使用n = input()
import re
while n>0:
expression = input()
operator,num1,num2 = re.findall('[+-/*]|\d+',expression)
if operator == '+': print(int(num1) + int (num2))
if operator == '-': print(int(num1) - int (num2))
if operator == '*': print(int(num1) * int (num2))
if operator == '%': print(int(num1) % int (num2))
if operator == '/': print(int(num1) // int (num2))
n = n - 1
New-Item -Type Directory -Path "C:\MyFolder"
$Acl = Get-Acl "C:\MyFolder"
$Ar = New-Object System.Security.AccessControl.FileSystemAccessRule("username", "FullControl", "Allow")
$Acl.SetAccessRule($Ar)
Set-Acl -Path "C:\MyFolder" -AclObject $Acl