題目:已知一個等式左邊是數字四則運算,右邊是未知數,每次計算一步,求出未知數的值。
分析:模擬,字符串。首先將左邊的數字算式分解成計算數和計算符,然後模擬計算即可。
每次找到最左邊的乘除法,沒有的話直接計算第一個,然後把前面的都向後移即可。
說明:注意數據的符號,╮(╯▽╰)╭。
#include <cstdlib>
#include <cstring>
#include <cstdio>
char buf[1001];
int integers[22];
char operators[22];
char variable[22];
int is_operator(char c)
{
if (c == '+') return 1;
if (c == '-') return 1;
if (c == '*') return 1;
if (c == '/') return 1;
return 0;
}
int is_number(char c)
{
return c >= '0' && c <= '9';
}
int main()
{
int cases = 0;
while (gets(buf)) {
if (!strcmp(buf, "")) {
continue;
}
if (cases ++) {
puts("");
}
//divide the data
int count = 0, state = 0, value = 0, sign = 1;
for (int i = 0; buf[i]; ++ i) {
if (state == 0) {
if (buf[i] == '+' || buf[i] == '-' || is_number(buf[i])) {
state = 1;
if (buf[i] == '-')
sign = -1;
else if (buf[i] == '+')
sign = +1;
else
value = buf[i]-'0';
}
}else if (state == 1) {
if (buf[i] == ' ' || buf[i] == '=' || is_operator(buf[i])) {
integers[count] = value*sign;
sign = +1;
value = 0;
if (is_operator(buf[i])) {
operators[count ++] = buf[i];
state = 0;
}else if (buf[i] == '=') {
operators[count ++] = buf[i];
state = 3;
}else {
state = 2;
}
}else {
value = value*10 + buf[i]-'0';
}
}else if (state == 2) {
operators[count ++] = buf[i];
if (is_operator(buf[i])) {
state = 0;
}else if (buf[i] == '=') {
state = 3;
}
}else if (state == 3) {
if (buf[i] != ' ') {
strcpy(variable, &buf[i]);
while (variable[strlen(variable)-1] == ' ') {
variable[strlen(variable)-1] = 0;
}
break;
}
}
}
// calculate the equation and output
for (int i = 0; i < count; ++ i) {
for (int j = i; j < count-1; ++ j) {
printf("%d %c ",integers[j],operators[j]);
}
printf("%d = %s\n",integers[count-1],variable);
int space = i;
for (int j = count-1; j >= i; -- j) {
if (operators[j] == '*' || operators[j] == '/') {
space = j;
}
}
if (operators[space] == '+') {
integers[space+1] = integers[space] + integers[space+1];
}else if (operators[space] == '-') {
integers[space+1] = integers[space] - integers[space+1];
}else if (operators[space] == '*') {
integers[space+1] = integers[space] * integers[space+1];
}else if (operators[space] == '/') {
integers[space+1] = integers[space] / integers[space+1];
}
for (int j = space; j >= i; -- j) {
integers[j] = integers[j-1];
operators[j] = operators[j-1];
}
}
}
return 0;
}