Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

파이썬에서 내장 함수 없이 하나의 수학 표현식을 평가하는 프로그램

<시간/>

(+, -, *, /)를 사용하여 수학 표현식을 나타내는 문자열이 있다고 가정합니다. 여기서 /는 정수 나누기를 나타내며 내장 함수를 사용하지 않고 결과를 평가하고 반환해야 합니다.

따라서 입력이 s ="2+3*5/7"과 같으면 출력은 2 + ((3 * 5) / 7) =4

와 같이 4가 됩니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • :=주어진 문자열을 뒤집습니다.
  • get_value() 함수를 정의합니다.
  • 기호 :=1
  • s가 비어 있지 않고 s의 마지막 요소가 "-"와 같으면
    • s에서 마지막 요소 삭제
    • 기호 :=-1
  • 값:=0
  • s가 비어 있지 않고 s의 마지막 요소가 숫자인 동안 do
    • 값 :=값 * 10
    • value :=value + s의 마지막 요소의 숫자 값, s의 마지막 요소 삭제
  • 반환 기호 * 값
  • get_term() 함수 정의
  • 용어:=get_value()
  • s가 비어 있지 않고 s의 마지막 요소가 * 또는 /인 동안 do
    • op :=s의 마지막 요소 및 s의 마지막 요소 삭제
    • 값:=get_value()
    • op가 "*"와 같으면
      • 용어 :=용어 * 값
    • 그렇지 않으면
      • term :=(1.0 * term / value)
      • 의 하한선
  • 반환 기간
  • 기본 방법에서 다음을 수행합니다.
  • an :=get_term()
  • s가 비어 있지 않은 동안 do
    • op :=s의 마지막 요소, s에서 삭제
    • 용어:=get_term()
    • op가 "+"와 같으면
      • ans :=ans + 용어
    • 그렇지 않으면
      • ans :=ans - 용어
  • 반환

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

예시

from math import floor, trunc
class Solution:
   def solve(self, s):
      s = list(s[::-1])

      def get_value():
         sign = 1
         if s and s[-1] == "-":
            s.pop()
            sign = -1
         value = 0
         while s and s[-1].isdigit():
            value *= 10
            value += int(s.pop())
         return sign * value

      def get_term():
         term = get_value()
         while s and s[-1] in "*/":
            op = s.pop()
            value = get_value()
            if op == "*":
               term *= value
            else:
               term = floor(1.0 * term / value)
         return term

      ans = get_term()
      while s:
         op, term = s.pop(), get_term()
         if op == "+":
            ans += term
         else:
            ans -= term
      return ans

ob = Solution()
s = "2+3*5/7"
print(ob.solve(s))

입력

"2+3*5/7"

출력

4