#1332 : 简单计算器
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
编写一个程序可以完成基本的带括号的四则运算。其中除法(/)是整除,并且在负数除法时向0取整。(C/C++/Java默认的除法就是向0取整,python默认的是向负无穷取整。)
例如计算 100 * ( 2 + 12 ) - (20 / 3) * 2, 结果是1388。
输入
一个长度不超过100的字符串,代表要计算的算式。包含数字0-9以及+-*/()。
输入保证计算过程不会超过32位有符号整数,并且其中的'-'都是减号没有负号。
输出
计算的结果。
- 样例输入
-
100*(2+12)-(20/3)*2
- 样例输出
-
1388
思路:栈模拟,因为有个括号,所以需要重复调用自身,写个函数;#include<bits/stdc++.h> using namespace std; #define ll long long #define esp 1e-10 const int N=1e5+10,M=1e6+10,mod=1e9+7,inf=1e9+10; char a[M]; ll getnum(char *a,ll lenn) { stack<char>s; stack<ll>num; ll x=lenn; ll pos=0; ll n=0; ll ans=0; if(a[pos]=='(') { ll en; ll flag=0; for(ll j=pos+1;;j++) { if(a[j]=='(') flag++; if(a[j]==')') { if(flag==0) {en=j; break; } else flag--; } } ll len=en-pos-1; num.push(getnum(a+pos+1,len)); pos=en+1; } else { for(pos=0; pos<x&&a[pos]>='0'&&a[pos]<='9'; pos++) { n*=10; n+=a[pos]-'0'; } num.push(n); } while(pos<x) { s.push(a[pos++]); if(a[pos]=='(') { ll en; ll flag=0; for(ll j=pos+1;;j++) { if(a[j]=='(') flag++; if(a[j]==')') { if(flag==0) { en=j; break; } else flag--; } } ll len=en-pos-1; n=getnum(a+pos+1,len); pos=en+1; } else { n=0; while(pos<x&&a[pos]>='0'&&a[pos]<='9') { n*=10; n+=a[pos]-'0'; pos++; } } if(s.top()=='*') { ll k=num.top(); num.pop(); num.push(n*k); s.pop(); } else if(s.top()=='/') { ll k=num.top(); num.pop(); if(n!=0) num.push(k/n); else num.push(n); s.pop(); } else num.push(n); } while(!s.empty()) { if(s.top()=='+') ans+=num.top(); else if(s.top()=='-') ans-=num.top(); num.pop(); s.pop(); } return ans+num.top(); } int main() { ll x,y,z,i,t; scanf("%s",a); printf("%lld ",getnum(a,strlen(a))); return 0; } // (1-2*3)/(2*3+(0-1))