새로운 스택 기반 언어를 구현할 시간입니다! 그것을 StackyMath라고합니다. 이것은 스택에 8 개의 연산과 스택에 숫자를 추가하는 방법을 가진 스택 기반 언어입니다.
작업 목록 :
/
: 부서. 스택의 상위 2 개 숫자에서 수행됩니다. 결과를 스택으로 다시 푸시합니다.*
: 곱셈. 스택의 상위 2 개 숫자에서 수행됩니다. 스택에서 결과를 다시 푸시-
: 빼기. 스택의 상위 2 개 숫자에서 수행됩니다. 스택에서 결과를 다시 푸시+
: 추가. 스택의 상위 2 개 숫자에서 수행됩니다. 스택에서 결과를 다시 푸시^
: 지수. 스택의 상위 2 개 숫자에서 수행됩니다. 스택에서 결과를 다시 푸시%
: 모듈로. 스택의 상위 2 개 숫자에서 수행됩니다. 스택에서 결과를 다시 푸시!
: 계승. 스택의 최상위 번호에서 수행됩니다. 스택에서 결과를 다시 푸시D
: 스택에서 최상위 번호를 복제
의사 코드로 정의 된 연산 :
/
:push(pop divided by pop)
*
:push(pop times pop)
-
:push(pop minus pop)
+
:push(pop plus pop)
^
:push(pop to the pop)
%
:push(pop mod pop)
!
:push(factorial pop)
D
:t = pop; push(t); push(t)
숫자를 스택에 푸시하는 방법 :
스택에 숫자를 추가하는 것은 쉽습니다. 필요한 경우 프로그램에 원시 숫자를 넣으십시오. 스택에 여러 숫자를 입력해야하는 경우 쉼표 ( ,
) 로 구분할 수 있습니다 . 프로그램은 -
입력에서 숫자 를 처리 할 필요가 없습니다 . 사용자가 1을 원하면 부정하고 싶은 숫자를 0으로 밀어야합니다 -
. 프로그램 입력의 숫자도 양의 정수로 제한됩니다.
입력:
프로그램은 명령 행 또는 표준 입력에서 입력을 가져와야합니다. 입력은 다음으로 구분 된 숫자 (과학적 표기법 또는 소수 없음)로만 구성됩니다. ,
필요에 따라 와 위에 정의 된 연산으로 .
산출:
프로그램은 스택 상단에 번호를 인쇄해야합니다.
오류 사례 :
- 프로그램이 용지를 너무 많이 넣으려고하면 인쇄해야합니다.
StackUnderflowException!!!
. - 0으로 나누면 인쇄
DivisionByZeroException!!!
- 프로그램을 실행하거나 입력에서 숫자를 처리하는 동안 64 비트를 초과하는 숫자가 인쇄되면
NumberOverflowException!!!
- 어떻게 든 스택 상단에 음수가 생기고 계승을 해야하는 경우 인쇄하십시오.
NegativeFactorialException!!!
- 스택 상단에 부동 소수점 숫자가 있고 다음 작업이 계승 인 경우 인쇄
FloatingFactorialException!!!
- 프로그램이 종료 될 때 스택에 숫자가없는 경우 (예 : 프로그램이 비어 있음) 인쇄
EmptyProgram!!!
노트:
- 에 대한 모든 오류 출력에 오류가 발생하거나 가장 가까운 값을 가져야합니다.
- 모든 숫자는 64 비트 부동 소수점으로 제한됩니다.
예제 프로그램 :
50,47* -> 2350
50,47/ -> 0.94
100,8! -> 40320
100D* -> 10000
! -> StackUnderflowException!!!
5,2/! -> FloatingFactorialException!!!
4,3!2*/ -> 3
654,489,48,43/5*7D+-*% -> 77.68749999999909
-> EmptyProgram!!!
(필요한 경우 더 추가 할 수 있습니다)
654,489,48,43/5*7D+-*%
반환해야합니다 77.6875
. ( 43/48*5-(7+7)
해야한다 (7+7)-43/48*5
)
!
로F
).