2017-03-24 1 views
1

그래서 저는 SPOJ로부터 연습을하고 있습니다, 그리고 그것은 간단한 계산기입니다. 답변을 제출할 때마다 NZEC 오류가 발생하며 int32로 정의해야하기 때문에 오류인지 궁금합니다. 다음은 내 코드입니다 :이 NZEC 오류에 대한 몇 가지 "솔루션"을 시도했습니다파이썬에서 int에서 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) 

으나 효과가 없었다. 결과는 정수를해야하는 경우

+0

사용하여 해당 사업자 또는 숫자의 수의 일치합니다. – ForceBru

+0

컴파일러가 제대로 작동하는지 확인하고 싶었습니다. – Jessus

+0

'int32 '(존재하지 않음)로 전환해야한다고 생각하는 이유는 무엇입니까? – ForceBru

답변

4

, 당신은 즉 a // b하지 a/b1, operator.floordiv 사용해야합니다

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))) 

을 그런데, 위의 코드는 당신과 같은 정확히 같은 않지만, 약 2 배 더 짧습니다!

어떻게?

  • znakif/else 문 톤 뭔가 동일한 경우는 사전 op에있는 모든 수학 연산자를 넣을 수 있는지 확인하고, 당신이 op[znak]에 필요한 연산자를 얻을?
  • 당신은 당신이 aiterable의 첫 번째 항목을 추출하고 슈퍼 좋은 보이는 목록b으로 다른 항목을두고 그 좋은 a, *b = iterable 구문을 사용할 수 있도록
  • op[znak] 함수는 파이썬 3에있어 그 두 개의 인수를 받아들이는, 그래서 당신은 map(int, nums)과 정수로 nums를 변환 한 후 별표 별도의 인수로 전달 : *map(int, nums)
  • 마지막으로 중요한 것은, 왜 Pythoni이 있는지 증가이 C 스타일 while 루프 인덱스를 사용 그것을 할 C 방법 - range(start, stop, [step])와 함께?
  • 마지막으로, 당신은 정말 변수 n 필요하지 않습니다, 그래서 당신은 어떤 막무가내 필요 느낌, 바로 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()))))) 

또는 단지 한 줄을 :

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()))))) 

이 일을 정확하게 첫 번째 버전으로. 이제는 재미있는 일이며, 파이썬이 얼마나 강력하고 얼마나 지저분한지를 보여줍니다. 는 집에서 시도하지 마십시오 : D


1 진정한 부문을 바닥 부문 대 : 1/10 == 0.1하지만 1 // 10 == 0을.

0

단순한 해결책 : 아이디어는 입력 된 헌장을 명령을 보존하는 토큰으로 분할하는 것입니다.우리의 경우 토큰은 operatorsnumbers이므로 정규 표현식을 사용하면 매우 간단합니다. [+-/*]는`sys.exit`를 사용할 필요는, 프로그램이 자동으로 종료 없습니다 \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 
+1

여전히 'a/b'와 같은 정수로 나뉜 정수는 부동 소수점 수입니다. – ForceBru

+0

@ForceBru fixed – anekix

+0

아니요. 부동 소수점으로 숫자를 나눌 경우 결과로 부동 소수점을 더 확실하게 얻을 수 있습니다. – ForceBru