1 条题解

  • 0

    题意分析

    我们需要解一元一次方程ax+b=cx+dax + b = cx + d,其中:

    • 方程形式为:左侧表达式==右侧表达式
    • 每个表达式由多个项组成,项可以是:
      • 常数项(如300300
      • 变量项(如2x2xxx
    • 运算符只有++-(没有一元运算符)
    • 需要处理三种情况:
      1. 唯一解(输出s\lfloor s \rfloor
      2. 无解(IMPOSSIBLEIMPOSSIBLE
      3. 无穷多解(IDENTITYIDENTITY

    解题思路

    1. 解析方程

      • 将方程按==分割为左右两部分
      • 分别解析左右表达式,计算:
        • xx的系数和(left_coefleft\_coefright_coefright\_coef
        • 常数项和(left_constleft\_constright_constright\_const
    2. 合并同类项

      • 总系数:total_coef=left_coefright_coeftotal\_coef = left\_coef - right\_coef
      • 总常数:total_const=right_constleft_consttotal\_const = right\_const - left\_const
    3. 判断解的情况

      • 如果total_coef=0total\_coef = 0
        • total_const=0total\_const = 0IDENTITYIDENTITY
        • 否则 → IMPOSSIBLEIMPOSSIBLE
      • 否则 → 解为total_const/total_coef\lfloor total\_const / total\_coef \rfloor

    实现步骤

    1. 输入处理

      • 读取测试用例数tt
      • 循环处理每个方程
    2. 表达式解析

      • ==分割方程
      • 对每部分表达式:
        • 初始化符号(默认为++
        • 逐个字符解析:
          • 遇到+/+/-更新符号
          • 提取数字(可能没有)和变量xx
          • 计算系数和常数
    3. 求解判断

      • 计算total_coeftotal\_coeftotal_consttotal\_const
      • 根据上述逻辑输出结果
    4. 输出处理

      • 注意三种情况的输出格式
      • 解需要向下取整

    代码实现

    
    
    #include <iostream>
    #include <cmath>
    
    using namespace std;
    
    int main()
    {
        int t;
        string s;
    
        cin >> t;
        while(t--) {
            cin >> s;
    
            int num = 1, sign = 1;
            int a = 0, b = 0;
            int flag = 0;       // 方程左右标识,0指左边,1指右边
    
            for(int i = 0; s[i]; i++) {
                if(s[i] == '=') {
                    sign = 1, num = 1;
                    flag = 1;
                } else if(s[i] == '+') {
                    sign = 1, num = 1;
                } else if(s[i] == '-') {
                    sign = -1, num = 1;
                } else {
                    num = (s[i] == 'x') ? 1 : 0;
                    while(isdigit(s[i])) {
                        num = num * 10 + s[i] - '0';
                        i++;
                    }
                    if(s[i] == 'x') {
                        if(flag == 0) b += num * sign;
                        else b -= num * sign;
                    } else {
                        i--;
                        if(flag == 0) a -= num * sign;
                        else a += num * sign;
                    }
                }
            }
    
            if(b == 0) {
                if(a == 0)
                    cout << "IDENTITY" << endl;
                else
                    cout << "IMPOSSIBLE" << endl;
            } else {
                int x = (int)floor((double)a / b);
                cout << x << endl;
            }
        }
    }
    • 1

    信息

    ID
    1296
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者