[岩石谷日报 P1022] 计算器改进(模拟 + 字符串处理) - 问题解决方案
最编程
2024-04-15 20:36:56
...
#include<bits/stdc++.h>
using namespace std;
string s;
int idx;
分别存储等式左侧的一次项系数、常数项;等式右侧的一次项系数、常数项和当前得到的系数·
int lx,ls,rx,rs,now;
//未知数符号
char c;
//存储正负情况
int zf;
int main()
{
cin>>s;
// 找到等式所在的index
idx=s.find('=');
// 初始化正负情况为正
zf=1;
for (int i=0; i<idx; i++)
{
// 特判第一个字符是否为'-'
if (i == 0 && s[i] == '-')
{
zf=-1;
continue;
}
if (s[i] >= '0' && s[i] <= '9')
{
now*=10;
now+=s[i]-'0';
}
else if (s[i] == '-' || s[i] == '+')
{
ls+=now*zf;
now=0;
if (s[i] == '-') zf=-1;
else zf=1;
}
else
{
// 一元方程未知数只有一个,直接存储就行
c=s[i];
if (now == 0)
{
// 一次项系数为1或者-1,被省略,直接查看存储正负情况的变量即可
lx+=zf;
}
else
{
lx+=zf*now;
now=0;
}
zf=0;
}
}
// 特判最后一项信息是否存储
if (s[idx-1] != c)
{
ls+=zf*now;
}
// 等式右端情况与上方等式左端判断情况完全相同
zf=1;
now=0;
for (int i=idx+1; i<s.length(); i++)
{
if (i == idx+1 && s[i] == '-')
{
zf=-1;
continue;
}
if (s[i] >= '0' && s[i] <= '9')
{
now*=10;
now+=s[i]-'0';
}
else if (s[i] == '-' || s[i] == '+')
{
rs+=now*zf;
now=0;
if (s[i] == '-') zf=-1;
else zf=1;
}
else
{
c=s[i];
if (now == 0)
{
rx+=zf;
}
else
{
rx+=zf*now;
now=0;
}
zf=0;
}
}
if (s[s.length()-1] != c)
{
rs+=zf*now;
}
// 可能存在-0情况
if ((double)(rs-ls)/(lx-rx) == 0)
{
printf("%c=%.3f",c,0);
}
else printf("%c=%.3f",c,(double)(rs-ls)/(lx-rx));
}