就是一道自己康康+手模的数学题啊qwq
Code:
1 #include <bits/stdc++.h> 2 using namespace std; 3 const double eps = 1E-8;//因为精度问题所以要取一个十分小的数来作为判断是否为0的标准 4 int n; 5 double a[101][101];//用来存矩阵 6 int main () { 7 scanf("%d", &n); 8 for (int i = 0; i < n; i++) { 9 for (int j = 0; j <= n; j++) { 10 scanf("%lf", &a[i][j]); 11 } 12 } 13 for (int i = 0; i < n; i++) { 14 int pre = i; 15 for (int j = i; j < n; j++) {//每次遍历选择一个当前位置系数绝对值最大的调换过来,防止误差 16 if (fabs(a[j][i] - a[pre][i]) >= eps) { 17 pre = j; 18 } 19 } 20 for (int k = 0; k <= n; k++) {//将这两行交换,把待处理的一行调至上方 21 swap(a[i][k], a[pre][k]); 22 } 23 if (fabs(a[i][i]) <= eps) {//如果系数为0就一定无解 24 printf("No Solution\n"); 25 return 0; 26 } 27 for (int k = i + 1; k <= n; k++) {//将该位系数化一并将这一行系数同除a[i][i] 28 a[i][k] /= a[i][i]; 29 } 30 a[i][i] = 1;//a[i][i]这个位置除或不除都可以,因为它这个位置化 1 后就不会对后面的值造成影响了,可以将其忽略 31 for (int j = 0; j < n; j++) {//枚举每一行 32 if (i != j) {//不能再处理当前这一行 33 for (int k = i + 1; k <= n; k++) {//这里直接从i+1位置开始即可 34 a[j][k] -= a[j][i] * a[i][k];//就是j行最前面那个不为0的系数乘上i行相应列的位置,然后此位置减去即可 35 } 36 //a[j][i] = 0; 加或不加都可以 37 } 38 } 39 } 40 for (int i = 0; i < n; i++) { 41 printf("%.2lf\n", a[i][n]);//输出答案 42 } 43 return 0; 44 }View Code