欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

[岩石谷日报 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));
}