如何对含数字符号的字符串及线性方程未知项进行排序?
如何对含数字和符号的字符串(如线性方程)进行排序?
看起来你搞混了「多个方程字符串整体排序」和「单个方程内部的项排序」的区别,这也是编程新手常踩的坑!你的需求是把方程里的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
相关产品推荐
相关产品推荐

