You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对含数字符号的字符串及线性方程未知项进行排序?

如何对含数字和符号的字符串(如线性方程)进行排序?

看起来你搞混了「多个方程字符串整体排序」和「单个方程内部的项排序」的区别,这也是编程新手常踩的坑!你的需求是把方程里的x、y、z项按变量顺序排列,但当前代码只是在给整个方程字符串做字典序排序,自然不会有你想要的效果。我来一步步帮你实现这个功能:


核心思路拆解

要实现3y+2x+6z=7 → 2x+3y+6z=7的效果,我们需要分四步走:

  • 把方程拆成等号左边的项和等号右边的常量(右边不需要排序)
  • 把左边的项拆成单个元素,比如3y+2x+6z拆成["3y", "2x", "6z"]
  • 按变量的字母顺序(x < y < z)给这些项排序
  • 把排序后的项重新拼接,再加上右边的常量,得到最终方程

完整代码实现(带详细注释)

下面是适配你需求的代码,每一步都加了注释,方便你理解:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <sstream>

using namespace std;

// 辅助函数:把字符串按指定分隔符拆成多个子串
vector<string> split(const string &s, char delimiter) {
    vector<string> tokens;
    string token;
    istringstream tokenStream(s);
    // 按分隔符逐个读取子串
    while (getline(tokenStream, token, delimiter)) {
        if (!token.empty()) { // 跳过空字符串(避免分隔符在首尾的情况)
            tokens.push_back(token);
        }
    }
    return tokens;
}

// 核心函数:对单个方程进行排序处理
string sortSingleEquation(string equation) {
    // 1. 拆分等号左右两部分
    size_t equalSignPos = equation.find('=');
    string leftSide = equation.substr(0, equalSignPos); // 左边的项:"3y+2x+6z"
    string rightSide = equation.substr(equalSignPos + 1); // 右边的常量:"7"

    // 2. 把左边的项拆成单个元素
    vector<string> terms = split(leftSide, '+'); // 得到["3y", "2x", "6z"]

    // 3. 自定义排序规则:按变量的字母顺序排序(x < y < z)
    sort(terms.begin(), terms.end(), [](const string &termA, const string &termB) {
        // 提取每个项的变量名(假设变量是项的最后一个字符,比如"3y"的变量是'y')
        char varA = termA.back();
        char varB = termB.back();
        return varA < varB; // 按字母升序排列
    });

    // 4. 把排序后的项重新拼接成左边的字符串
    string sortedLeft;
    for (size_t i = 0; i < terms.size(); ++i) {
        if (i != 0) {
            sortedLeft += "+"; // 项之间加+号
        }
        sortedLeft += terms[i];
    }

    // 5. 拼接成完整的方程返回
    return sortedLeft + "=" + rightSide;
}

// 处理多个方程的输入和输出
void processEquations() {
    int count;
    cin >> count;
    cin.ignore(); // 跳过输入count后的换行符,避免getline读到空内容

    vector<string> equations;
    for (int i = 0; i < count; ++i) {
        string eq;
        getline(cin, eq);
        equations.push_back(eq);
    }

    // 对每个方程排序后输出
    for (const string &eq : equations) {
        cout << sortSingleEquation(eq) << endl;
    }
}

int main() {
    processEquations();
    return 0;
}

测试示例

输入:

1
3y+2x+6z=7

输出:

2x+3y+6z=7

如果输入多个方程:

2
5z+3x=9
4y+1x+2z=5

输出:

3x+5z=9
1x+4y+2z=5

小扩展(可选)

如果你的方程里有减号(比如3y-2x+6z=7),可以把减号替换成+-后再拆分,这样split函数就能正确识别负项了,比如:

// 在拆分左边之前,把减号替换成"+-"
replace(leftSide.begin(), leftSide.end(), '-', '+');
// 然后拆分的时候,第一个项如果是负的也能正确处理

内容的提问来源于stack exchange,提问作者BMNY

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:23:23