#include<stdio.h> double argu_matrix[300][300],x[300];//arguement matrix and x matrix int main(void) { int n,i,j,k; double sum; scanf("%d",&n); for(i=0;i<n;i++) for(j=0;j<n+1;j++) scanf("%lf",&argu_matrix[i][j]); //here is the lack of checking for the argu_matrix //to do for(i=0;i<n-1;i++) { for(j=i+1;j<n;j++) argu_matrix[j][i]=argu_matrix[j][i]/argu_matrix[i][i]; //get the li parameter for(j=i+1;j<n;j++) for(k=i+1;k<=n;k++) argu_matrix[j][k]=argu_matrix[j][k]-argu_matrix[j][i]*argu_matrix[i][k]; //updata the remain matrix } for(i=n-1;i>=0;i--) //back-substitute { sum=0; for(j=i+1;j<n;j++) sum+=argu_matrix[i][j]*x[j]; x[i]=(argu_matrix[i][n]-sum)/argu_matrix[i][i]; } for(i=0;i<n-1;i++) //output the x[] printf("%lf ",x[i]); printf("%lf\n",x[i]); return 0; }
上面的代码精度不够,修改后如下:
#include<stdio.h> #include<algorithm> #define type double #define N 100 #define Abs(x) ((x)<0?-(x):(x)) using namespace std; type matrix[N][N]; void gauss_elimination(int n) { int i,j,k,r; //消元过程 for(i=0;i<n;i++) { r=i; //选绝对值最大的去消 for(j=i+1;j<n;j++) if(Abs(matrix[j][i])>Abs(matrix[r][i])) r=j; if(r!=i) for(j=0;j<=n;j++) swap(matrix[r][j],matrix[i][j]); //与i+1~n行进行消元 for(j=n;j>=i;j--) for(k=i+1;k<n;k++) matrix[k][j]-=matrix[k][i]/matrix[i][i]*matrix[i][j]; } //回代过程 for(i=n-1;i>=0;i--) { for(j=i+1;j<n;j++) matrix[i][n]-=matrix[i][j]*matrix[j][n]; matrix[i][n]/=matrix[i][i]; } }