读书人

NOIP 2005 齐名表达式 四则运算

发布时间: 2012-11-06 14:07:00 作者: rapoo

NOIP 2005 等价表达式 四则运算

这题就是一个比较经典的四则运算表达式求值

由于只有一个未知数a,所以我们可以选择找几个数带入a 中,然后求值,看与原式子是否相同

中间可能会爆long long ,不过按理来说爆完之后等价的表达式的值还是相同的。

求四则运算的过程也是相当经典的栈的应用了

用两个栈,一个存操作,一个存数

然后符号之间有个优先级别的问题。这时候要分栈内和栈外两种来算 详见我手写了个表



#include <iostream>#include <cstdio>#include <cstring>#include <ctime>#include <cstdlib>#include <stack>#include <cmath>#define eps 1e-6using namespace std;char str1[55], str2[55];char s1[55], s2[55];int nei[333], wai[333];int len;long long tet[10] = {11, 15, 18, 25, 29, 30, 36, 50, 55, 70};stack<char>optr;stack<long long>opnd;bool flag;long long calculate(long long x, long long y, char c){    switch(c)    {        case '+': return x + y;        case '-': return x - y;        case '*': return x * y;        case '^':        long long tmp = 1;        for(int i = 0; i < y; i++) tmp *= x;        return tmp;    }}char cmp(char a, char b){    if(nei[a] > wai[b]) return '>';    else if(nei[a] == wai[b]) return '=';    return '<';}long long gao(char *s, long long t){    int i = 0;    long long num;    while(s[i] != '#' || optr.top() != '#')    {        num = 0;        if(!flag) return -1;        if(s[i] >= '0' && s[i] <= '9')        {            while(s[i] >= '0' && s[i] <= '9')            {                num *= 10;                num += s[i] - '0';                i++;            }            opnd.push(num);        }        else if(s[i] == 'a')        {            num = t;            opnd.push(num);            i++;        }        else        {            switch(cmp(optr.top(), s[i]))            {                case '<' : optr.push(s[i]); i++; break;                case '=' : optr.pop(); i++; break;                case '>' :                if(opnd.empty())                {                    flag = false;                    return -1;                }                long long ta = opnd.top();                opnd.pop();                if(opnd.empty())                {                    flag = false;                    return -1;                }                long long tb = opnd.top();                opnd.pop();                opnd.push(calculate(tb, ta, optr.top()));                optr.pop();                break;            }        }    }    return opnd.top();}void init(){    while(!opnd.empty()) opnd.pop();    while(!optr.empty()) optr.pop();    optr.push('#');}int main(){    nei['+'] = 2; wai['+'] = 1;    nei['-'] = 2; wai['-'] = 1;    nei['*'] = 4; wai['*'] = 3;    nei['^'] = 6; wai['^'] = 5;    nei[')'] = 8; wai[')'] = 0;    nei['('] = 0; wai['('] = 8;    nei['#'] = -1; wai['#'] = -1;    gets(str1);    len = 0;    for(int i = 0; str1[i]; i++)        if(str1[i] != ' ') s1[len++] = str1[i];    s1[len++] = '#';    s1[len] = '\0';    int cas;    scanf("%d", &cas);    getchar();    for(int i = 0; i < cas; i++)    {        gets(str2);        len = 0;        for(int j = 0; str2[j]; j++)            if(str2[j] != ' ') s2[len++] = str2[j];        s2[len++] = '#';        s2[len] = '\0';        flag = 1;        for(int j = 0; j < 10; j++)        {            init();            long long t1 = gao(s1, tet[j]);            init();            long long t2 = gao(s2, tet[j]);            if(t1 != t2)            {                flag = 0;                break;            }        }        if(flag) printf("%c", i + 'A');    }    printf("\n");    return 0;}


读书人网 >编程

热点推荐