这个程序主要是判断输出的结果是否与输入相符。
输入:9214345
应该输出:(114514+114514)∗(−11+4∗51/4)+(11∗4514+(−1145∗(1−4)+(1∗1−45∗(1−4))))
但是这个程序判的这个表达式的结果为 53225.000000。
我怀疑是超出 long double 范围了,1≤n≤109,能不能帮忙调一下
#include "testlib.h"
#include <bits/stdc++.h>
using namespace std;
bool Symbol(char ch) {//判断运算符
if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')')
return true;
return false;
}
bool Cont_Symbol(char ch) {//判断运算符
if (ch == '+' || ch == '-' || ch == '*' || ch == '/')
return true;
return false;
}
char Precode(char a, char b) { //运算符优先级
char z;
if (Symbol(b))
switch (a) {
case '+':
case '-':
if ((b == '*') || (b == '/') || (b == '('))
z = '<';
else
z = '>';
break;
case '*':
case '/':
if (b == '(')
z = '<';
else
z = '>';
break;
case '(':
if (b == ')')
z = '=';
else z = '<';
break;
case ')':
if (b == '(')
z = 'E';
else
z = '>';
break;
} else z = 'E';
return (z);
}
signed main(int argc, char* argv[]) {
registerTestlibCmd(argc, argv);
string str = ouf.readLine(), kkk = str;
long long abcdefghijklmn = inf.readLong();
long long flag = 1;
long double a, b;
char ch;
vector<long double> num;
vector<char> symbol;
long long count1 = 0, count2 = 0;
if (str.empty()) flag = 3; //空字符串
if (str[0] == '+' || str[0] == '*' || str[0] == '/')flag = 3;//行首字符
if (Cont_Symbol(str.back()))flag = 3;//行尾字符
long long temp = 0;
for (int i = 0; i < str.size(); i++) {
if (str[i] != ' ')temp = 1;
if (Cont_Symbol(str[i]) && Cont_Symbol(str[i + 1]))flag = 3; //连续运算符
if (str[i] == '(') {
count1++;
if (str[i + 1] == ')')flag = 3;//空括号
}
if (str[i] == ')')count2++;
}
if (temp == 0)flag = 3;//空白字符串
if (count1 != count2)flag = 0;//括号不匹配
else if (flag != 3) //合法表达式
for (int i = 0; i < str.size(); i++) { //遍历字符串入栈
if (isdigit(str[i])) {
float number = 0;
while (isdigit(str[i])) {//数字入栈
number *= 10;
number += str[i] - '0';
i++;
}
i--;
num.push_back(number);
} else if (Symbol(str[i])) { //运算符:优先级大入栈,否则出栈
if (symbol.empty()) {
symbol.push_back(str[i]);
} else {
switch (Precode(symbol.back(), str[i])) {
case '<':
symbol.push_back(str[i]);
break;
case '=':
symbol.pop_back();
break;
case '>':
a = num.back();
num.pop_back();
if (!num.empty()) {
b = num.back();
num.pop_back();
} else b = 0;
ch = symbol.back();
if (ch == '+') {
num.push_back(a + b);
} else if (ch == '-') {
num.push_back(b - a);
} else if (ch == '*')num.push_back(a * b);
else if (ch == '/') {
if (a == 0) {//除0测试
flag = 2;
num.push_back(0);
} else num.push_back(b / a);
}
symbol.pop_back();
i--;
break;
case 'E':
flag = 0;
break;//括号不匹配
}
}
} else if (str[i] == ' ')continue;
else {
flag = 0;
break;
}
}
if (flag == 1)
//遍历完成后清栈
while (!symbol.empty()) {
a = num.back();
num.pop_back();
if (!num.empty()) {//负数检查
b = num.back();
num.pop_back();
} else b = 0;
ch = symbol.back();
if (ch == '+')num.push_back(a + b);
else if (ch == '-')num.push_back(b - a);
else if (ch == '*')num.push_back(a * b);
else if (ch == '/') {
if (a == 0) {
flag = 2;
num.push_back(0);
} else num.push_back(b / a);
}
symbol.pop_back();
}
if (flag == 2)quitf(_wa, "The answer is wrong: expected = %lld, found = Error", abcdefghijklmn);
else if (flag == 0 || flag == 3)quitf(_wa, "The answer is wrong: expected = %lld, found = Error", abcdefghijklmn);
else if (flag == 1) {
if (num.back() != abcdefghijklmn) {
double k = num.back();
quitf(_wa, "The answer is wrong: expected = %lld, found = %lf", abcdefghijklmn, k);
} else {
quitf(_ok, "The answer is correct.");
}
}
return 0;
}