原理
手动模拟呢大家应该都会,小学知识。
从x1开始依次消元,消出一个矩阵,最后回带求解。
Code
//by floatiy #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> using namespace std; const double eps = 0.00001; int n; double a[105][105]; double ans[105]; void swap_judge(int x) { int det = x; for(int i = x + 1; i <= n; i++) { if(abs(a[i][x]) > abs(a[det][x])) det = i; } if(det != x) { for(int i = x; i <= n + 1; i++) { swap(a[x][i],a[det][i]); } } return; } void debug() { for(int i = 1; i <= n; i ++) { for(int j = 1; j <= n + 1; j++) { printf("%lf ",a[i][j]); } printf("\n"); } printf("\n"); } void Gauss() { double t; for(int i = 1; i <= n; i++) { //枚举行 // debug(); // Sleep(3000);system("cls"); swap_judge(i); if(fabs(a[i][i])<=eps){ printf("No Solution\n"); exit(0); } for(int j = i + 1; j <= n; j++) { if(fabs(a[j][i]) > eps) { t = a[i][i] / a[j][i]; for(int k = i; k <= n + 1; k++) { //还有答案列,所以k+1 a[j][k] = a[j][k] * t - a[i][k]; } } } // debug(); } // debug(); // system("cls"); for(int i = n; i; i--) { for(int j = i + 1; j <= n; j++) { a[i][n + 1] -= a[i][j] * a[j][n + 1]; } a[i][n + 1] /= a[i][i]; } // debug(); } int main() { cin>>n; for(int i = 1; i <= n; i++) { for(int j = 1; j <= n + 1; j++) { scanf("%lf",&a[i][j]); } } Gauss(); for(int i = 1;i <= n;i++) { printf("%.2lf\n",a[i][n + 1]); } return 0; }