【华为OJ】四则运算
来源:互联网 发布:程序员 硬件 编辑:程序博客网 时间:2024/06/09 17:19
题目:
输入输出:
自己写的代码,在本地编译可以通过,但是提交上去通不过:
#include<iostream>#include<stack>#include<cctype>#include<string>#include<cstdio>#include<cstdlib>using namespace std;#define N_OPTR 13typedef enum{ ADD, SUB, MUL, DIV, POW, FAC, L_P1, R_P1, L_P2, R_P2, L_P3, R_P3, EOE } operation1;const char pri[N_OPTR][N_OPTR] = { /*-------------------当前运算符------------------------*/ /* + - * / ^ ! ( ) [ ] { } \0 */ /* + */ '>', '>', '<', '<', '<', '<', '<', '>', '<', '>', '<', '>', '>', /* - */ '>', '>', '<', '<', '<', '<', '<', '>', '<', '>', '<', '>', '>', /* 栈 * */ '>', '>', '>', '>', '<', '<', '<', '>', '<', '>', '<', '>', '>', /* 顶 / */ '>', '>', '>', '>', '<', '<', '<', '>', '<', '>', '<', '>', '>', /* 运 ^ */ '>', '>', '>', '>', '>', '<', '<', '>', '<', '>', '<', '>', '>', /* 算 ! */ '>', '>', '>', '>', '>', '>', ' ', '>', ' ', '>', ' ', '>', '>', /* 符 ( */ '<', '<', '<', '<', '<', '<', '<', '=', ' ', ' ', ' ', ' ', ' ', /* ) */ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', /* [ */ '<', '<', '<', '<', '<', '<', '<', ' ', '<', '=', ' ', ' ', ' ', /* ] */ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', /* { */ '<', '<', '<', '<', '<', '<', '<', ' ', '<', ' ', '<', '=', ' ', /* } */ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', /* \0 */ '<', '<', '<', '<', '<', '<', '<', ' ', '<', ' ', '<', ' ', '='};void readNumber(char*& p, stack<float>& stk){ stk.push((float)(*p - '0')); while (isdigit(*(++p))){ float k = stk.top(); stk.pop(); stk.push(k* 10 + (*p - '0')); } if (*p != '.')return; float fraction = 1; while (isdigit(*(++p))){ float k = stk.top(); stk.pop(); stk.push(k + (*p - '0')*(fraction/=10)); }}operation1 optr2rank(char op){ switch (op){ case '+':return ADD; case '-':return SUB; case '*':return MUL; case '/':return DIV; case '^':return POW; case '!':return FAC; case '(':return L_P1; case ')':return R_P1; case '[':return L_P2; case ']':return R_P2; case '{':return L_P3; case '}':return R_P3; case '\n':return EOE; default:exit(-1); }}float calcu(float pOpnd){ if (pOpnd == 0)return 1; return pOpnd*calcu(pOpnd - 1);}float calcu(float pOpnd1, char op, float pOpnd2){ switch (op){ case '+':return pOpnd1 + pOpnd2; break; case '-':return pOpnd1 - pOpnd2; break; case '*':return pOpnd1*pOpnd2; break; case '/':if (!(pOpnd2 - 0 < 0.0000001 && pOpnd2 - 0 > -0.0000001)){ return pOpnd1 / pOpnd2; break; } else{ cout << "error" << endl; return 0; } case '^': float a = pOpnd1; while (1<pOpnd2--){ pOpnd1 *= a; } return pOpnd1; break; }}char orderBetween(char op1, char op2){ return pri[optr2rank(op1)][optr2rank(op2)];}float evaluate(char* S){ stack<float>opnd; stack<char>optr; optr.push('\n'); while (!optr.empty()){ if (isdigit(*S)){ readNumber(S, opnd); } else{ switch (orderBetween(optr.top(), *S)){ case '<': optr.push(*S); S++; break; case '=': optr.pop(); S++; break; case '>':{ char op = optr.top(); optr.pop(); if (op == '!'){ float pOpnd = opnd.top(); opnd.pop(); opnd.push(calcu(pOpnd)); } else{ float pOpnd2 = opnd.top(); opnd.pop(); float pOpnd1 = opnd.top(); opnd.pop(); opnd.push(calcu(pOpnd1, op, pOpnd2)); } break; } default:exit(-1); } } } float x = opnd.top(); opnd.pop(); return x;}int main(){ char s[200],s1[250]; int i = 0,k=0; while ((s[i++] = getchar()) != '\n'); for (int j = 0; j < i; j++){ if (s[j] != '-')s1[k++] = s[j]; else{ if (j == 0){ s1[k++] = '('; s1[k++] = '0'; s1[k++] = s[j]; while (isdigit(s[++j]) && j<i)s1[k++] = s[j]; s1[k++] = ')'; } if (!isdigit(s[j - 1])){ s1[k++] = '('; s1[k++] = '0'; s1[k++] = s[j]; while (isdigit(s[++j]) && j<i)s1[k++] = s[j]; s1[k++] = ')'; if(j<i)s1[k++] = s[j]; } else s1[k++] = s[j]; } } cout << evaluate(s1)<<endl; return 0;}
- AC的代码,有待进一步深究:
#include<iostream>#include<string>#include<sstream>#include<deque>using namespace std;void addNum(deque<string>&Q, int num){ if (!Q.empty()){ int cur = 0; if (Q.back() == "*" || Q.back() == "/"){ string top = Q.back(); Q.pop_back(); stringstream ss(Q.back()); ss >> cur; Q.pop_back(); num = top == "*" ? (cur*num) : (cur / num); } } stringstream ss; ss << num; Q.push_back(ss.str());}int getNum(deque<string>& Q){ int num = 0, R = 0; string f("+"); while (!Q.empty()){ stringstream ss(Q.front()); ss >> num; Q.pop_front(); R = (f == "+") ? (R + num) : (R - num); if (!Q.empty()){ f = Q.front(); Q.pop_front(); } } return R;}int* value(string& s, int i){ deque<string>Q; int pre=0; while (i < s.length() && s[i] != ')' && s[i] != ']' && s[i] != '}'){ if (s[i] >= '0' && s[i] <= '9'){ pre = pre * 10 + s[i++] - '0'; } else if (s[i] != '(' && s[i] != '[' && s[i] != '{'){ addNum(Q, pre); string ss; ss += s[i++]; Q.push_back(ss); pre = 0; } else{ int* bra = NULL; bra = value(s, i + 1); pre = bra[0]; i = bra[1] + 1; } } addNum(Q, pre); int* R = new int[2]; R[0] = getNum(Q); R[1] = i; return R;}int main(){ string s; while (cin >> s){ int *R = value(s, 0); cout << R[0] << endl; } return 0;}
0 0
- 华为OJ(四则运算)
- 【华为OJ】【095-四则运算】
- 华为OJ—四则运算
- 【华为OJ】四则运算
- 华为OJ 四则运算-java
- 华为OJ——四则运算
- 带括号的四则运算——华为OJ
- 华为笔试.四则运算
- 华为题目(四则运算)
- [华为机试题]四则运算
- 华为机试 四则运算
- OJ分数的四则运算
- zzuli OJ 1037: 四则运算
- 华为OJ
- 华为oj:
- 华为机试简单四则运算
- 华为机试—四则运算
- [华为机试真题]68.简单四则运算
- 使用Navicat for MySQL只导出MySQL数据库的表结构-图文教程
- 机房收费之上下机
- hdu 4283 You Are the One (区间dp)
- POJ 3461
- 知识点小结
- 【华为OJ】四则运算
- jq选项卡效果代码
- 论文阅读:Reading Text in the Wild with Convolutional Neural Networks
- 开源许可证 分类剖析
- WIN10安装ubuntu,重启找不到windows引导
- 涂鸦移动面试准备
- next表的套路写法
- linux软件包管理--yum源码包
- Day 6 of 6