voidgauss(double a[][50], int x, int y, int hang, int lie) { if (x >= hang || y >= lie) return; bool flag = true; // 用于判断第一列是否为空 int idx = 0;//用于标记找到的第一个元素不为0的行号 for (int i = x; i < hang; i++) { if (a[i][y] != 0) { flag = false; idx = i; break; } } if (flag == true) gauss(a, x, y + 1, hang, lie); else { //idx不为0时,需要将这一行与第一行换位置 if (idx != 0) { for (int i = 0; i < lie; i++) swap(a[idx][i], a[x][i]); } //对下面行中所有第一项不为0的行进行减操作 for (int i = idx + 1; i < hang; i++) { for (int j = y+1; j < lie; j++) a[i][j] -= a[i][y] / a[x][y] * a[x][j]; a[i][y] = 0; } gauss(a, x + 1, y + 1, hang, lie); } }
voidsolve() { double a[50][50], cnt, q, k = 0, N = 0, flag = 0;//二维数组a模拟矩阵 string thing;//存储每一个方程式 set <string> s;//存储出现过的元素,并对其去重 map<string, int> b;//存储某个物质中某个元素所对应的序号,即在矩阵中的行数
memset(a, 0, sizeof(a));
cin >> cnt;
for (int i = 0; i < cnt; i++)//创建矩阵 { cin >> thing; q = 0; string temp = ""; while (q < thing.length()) { temp = ""; while (q < thing.length() && isalpha(thing[q])) { temp.push_back(thing[q]); q++; } s.insert(temp); int x = 0; while (q < thing.length() && isdigit(thing[q])) { x = x * 10 + thing[q] - '0'; q++; }