Pagini recente » Cod sursa (job #2775369) | Cod sursa (job #1438692) | Cod sursa (job #3250872) | Cod sursa (job #2120364) | Cod sursa (job #2708024)
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <deque>
#include <unordered_set>
#include <unordered_map>
#include <bitset>
#include <climits>
#include <queue>
#define MOD 66601
using namespace std;
ifstream cin("evaluare.in") ;
ofstream cout("evaluare.out") ;
/// trebe sa gasim primul
long long poww(long long a, long long n)
{
long long aux = 1 ;
while(n --)
aux *= a ;
return aux ;
}
char *urm_elem(char *a, char *cautat, int n)
{
//cout << a << " " << cautat << " " << n << endl ;
int aux = 0 ;
for(int f = n - 1 ; f >= 0 ; f --)
{
if(a[f] == ')')aux ++ ;
else if(a[f] == '(') aux -- ;
if(!aux && strchr(cautat, a[f]))return &a[f] ;
}
return 0 ;
}
long long eval_exp(char *a, int n)
{
char *ptr ;
if(ptr = urm_elem(&a[0], "+-", n))
{
if(*ptr == '+')return eval_exp(a, ptr - a) + eval_exp(ptr + 1, n - (ptr - a) - 1) ;
if(*ptr == '-')return eval_exp(a, ptr - a) - eval_exp(ptr + 1, n - (ptr - a) - 1) ;
}
if(ptr = urm_elem(&a[0], "*/", n))
{
if(*ptr == '*')return eval_exp(a, ptr - a) * eval_exp(ptr + 1, n - (ptr - a) - 1) ;
if(*ptr == '/')return eval_exp(a, ptr - a) / eval_exp(ptr + 1, n - (ptr - a) - 1) ;
}
if(ptr = urm_elem(&a[0], "^", n))
{
if(*ptr == '-')return poww(eval_exp(a, ptr - a), eval_exp(ptr + 1, n - (ptr - a) - 1)) ;
}
if(a[0] != '(')
{
string aux ;
for(int f = 0 ; f < n ; f ++)
aux += a[f] ;
return atoll(&aux[0]) ;
}
while(a[0] == '(' && a[n - 1] == ')')n -= 2, a ++ ; /// scoatem parantezele useless
eval_exp(a, n) ;
}
int main()
{
string a ;
cin >> a ;
cout << eval_exp(&a[0], a.size()) ;
return 0 ;
}