玄关
查看原帖
玄关
902351
Little_x_starTYJ楼主2024/6/7 11:43

这个程序主要是判断输出的结果是否与输入相符。

输入:92143459214345

应该输出:(114514+114514)∗(−11+4∗51/4)+(11∗4514+(−1145∗(1−4)+(1∗1−45∗(1−4))))(114514+114514)*(-11+4*51/4)+(11*4514+(-1145*(1-4)+(1*1-45*(1-4))))

但是这个程序判的这个表达式的结果为 53225.00000053225.000000。

我怀疑是超出 long double 范围了,1≤n≤1091\le n\le 10^9,能不能帮忙调一下

#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;
}
2024/6/7 11:43
加载中...