//仅对高斯消元过程中不发生行交换的情况适用。
#include <iostream> #include <cstring> #include <vector> #include <cmath> #include <cstdio> #include <cstring> using namespace std; const int size_n=100; const double exps=1e-7; double a[size_n][size_n],L[size_n][size_n],b[size_n],tem[size_n],ans[size_n]; void get_ans2(int n){ for(int i=n;i>=1;--i){ double sum=0; for(int j=n;j>i;--j){ sum+=ans[j]*a[i][j]; } ans[i]=(tem[i]-sum)/a[i][i]; } } void get_ans1(int n){ for(int i=1;i<=n;++i){ double sum=0; for(int j=1;j<=i;++j){ sum+=tem[j]*L[i][j]; } tem[i]=(b[i]-sum)/L[i][i]; } } //void get_ans1(int n){ // for(int i=1;i<=n;++i){ // double sum=0; // for(int j=1;j<i;++j) // sum+=tem[j]*L[i][j]; // tem[i]=(b[i]-sum)/L[i][i]; // } //} void fun(int n){ for(int i=1;i<=n;++i){ if(fabs(a[i][i])<exps){ cout<<"无穷多解"<<endl; return; } for(int j=i+1;j<=n;++j){ double tem=a[j][i]/a[i][i]; L[j][i]=tem; for(int k=1;k<=n;++k){ a[j][k]-=a[i][k]*tem; } // b[j]-=b[i]*tem; } } // for(int i=1;i<=n/2;++i){ // for(int j=1;j<=n;++j) // swap(L[i][j],L[n+1-i][j]); // } get_ans1(n); // for(int i=1;i<=n/2;++i){ // swap(tem[i],tem[n+1-i]); // } get_ans2(n); } int main() { // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); int n; cin>>n; memset(L,0,sizeof(L)); for(int i=1;i<=n;++i) L[i][i]=1; for(int i=1;i<=n;++i){ for(int j=1;j<=n;++j){ cin>>a[i][j]; } } for(int i=1;i<=n;++i) cin>>b[i]; fun(n); // for(int i=1;i<=n;++i){ // for(int j=1;j<=n;++j){ // cout<<L[i][j]<<" "; // } // cout<<endl; // } // for(int i=1;i<=n;++i){ // for(int j=1;j<=n;++j){ // cout<<a[i][j]<<" "; // } // cout<<endl; // } // for(int i=1;i<=n;++i) // cout<<tem[i]<<endl; for(int i=1;i<=n;++i) printf("%.2f\n",ans[i]); return 0; }
原文:http://blog.csdn.net/fangpinlei/article/details/44559113