练习 P1022 计算器的改良

计算器的改良
实现解一元一次方程
输入:输入均合法
输出:精确到小数点后三位 (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;
}
发布了47 篇原创文章 · 获赞 4 · 访问量 1282

猜你喜欢

转载自blog.csdn.net/listenhhh/article/details/103924819