VIJOS-P1344(计算器改良版)
VIJOS-P1344
时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte
描述
问题描述: NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能。实验室将这个任务交给了一个刚进入的新手ZL先生。为了很好的完成这个任务,ZL先生首先研究了一些一元一次方程的实例: 4+3x=8 6a-5+1=2-2a -5+12y=0 ZL先生被主管告之,在计算器上键入的一个一元一次方程中,只包含整数、小写字母及+、-、=这三个数学符号(当然,符号“-”既可作减号,也可作负号)。方程中并没有括号,也没有除号,方程中的字母表示未知数。问题求解: 编写程序,解输入的一元一次方程,将解方程的结果(精确至小数点后三位)输出至屏幕。 你可假设对键入的方程的正确性的判断是由另一个程序员在做,或者说可认为键入的一元一次方程均为合法的,且有唯一实数解。
样例输入
6a-5+1=2-2a
样例输出
a=0.750
解析:先找到字符串中的“=”,将字符串分割成左右两个部分,再分别求出左边和后边字符的系数和无字符系数,保存起来,最后相除即可得到答案。(住:数字可能不只一位,需要进位)
#include<iostream> #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> #include<stack> using namespace std; string op; int a, b, c, d; int str[100], ans; void func(int l, int r, int x, int y) { int j = 0, k = 0, flag = 1; x = y = 0; memset(str, 0, sizeof(str)); for(int i = l; i <= r; i++) { switch(op[i]) { case '+': flag = 1, y += str[j++], k = 0; break; case '-': flag = -1, y += str[j++], k = 0; break; } if(isdigit(op[i])) { str[j] = (k * 10 + op[i] - '0') * flag; k = str[j] * flag; } if(islower(op[i])) { if(i == l || !isdigit(op[i-1])) x += flag; else { x += str[j++]; k = 0; } } } y += str[j]; if(l == 0) a = x, b = y; else c = x, d = y; } int main() { char ch; while(cin >> op) { int len = op.size(); int k = op.find("="); for(int i = 0; i < len; i++) if(islower(op[i])) ch = op[i]; int flag = 1, j = 0; func(0, k - 1, a, b); func(k + 1, len - 1, c, d); if(d - b != 0) printf("%c=%.3f\n", ch, (d - b) * 1.0 / (a - c)); else printf("%c=0.000\n", ch); } return 0; }
浙公网安备 33010602011771号