计算器的改良
实现解一元一次方程
输入:输入均合法
输出:精确到小数点后三位 (luogu)
- 难度主要在各方面考虑完全,东西都在注释里了,暂时先直接放上去,有空补充题解。
#include <bits/stdc++.h>
using namespace std;
const int mx = 100;
int main()
{
double sum1=0, sum2=0; //前者存常数项和,后者存系数和
double bl = 1.0; //设置符号位,用于求和时的运算判断
char ch1; //记录变量名
string str;
cin >> str;
str += '*';//解决判断到最后一个的时候不能正常停止
int ind = str.find('=');
if(isalpha(str[0])) //考虑的是字符串第一个就是字母
sum2++;
for(int i=0; i<str.length(); i++)
{
if(i >= ind)
bl = -1.0;
if(isdigit(str[i]))
{
double anssum = 0; //中间变量,记录一下数字,等下判断是系数还是常数项
//cout << "遍历值 " << str[i] <<endl;
for(int j=i; j<=str.length(); j++)
{
if(isdigit(str[j]))
{
//数字处理部分
if(j == i)
anssum += str[j] - '0';
else
anssum = anssum * 10 + str[j] - '0';
}
else
{
//cout << "走到 " << anssum << endl;
if(isalpha(str[j])) //字母说明是系数
{
ch1 = str[j];
if(i == 0 || str[i-1] == '+' || str[i-1] == '=')
{
sum2 += (bl * anssum);
}
else if(str[i-1] == '-')
{
sum2 -= (bl * anssum);
}
//cout << "系数和 sum2 为 " << sum2 << endl;
}
else //当是- + = 时
{
if(i == 0 || str[i-1] == '+' || str[i-1] == '=')
{
sum1 += (bl * anssum);
}
else if(str[i-1] == '-')
{
sum1 -= (bl * anssum);
}
//cout << "实数和 sum1 为 " << sum1 << endl;
}
i = j; //把i调至符号位,之后经过for里面的i++转至新的数字部分
break;
}
}
}
}
//经过上面的处理可以得到,sum1 * (x) + sum2 = 0
///另外这里有个问题就是,当sum1/sum2等于0时,再乘个-1得出来的是-0.000,不知道什么原理,就先做个if···else···判断处理了
if(sum1 / sum2 != 0)
cout << fixed << setprecision(3) << ch1 << "=" << -1 * (sum1 / sum2) << endl;
else
cout << fixed << setprecision(3) << ch1 << "=" << (sum1 / sum2) << endl;
return 0;
}