高斯消元(求解double,int型方程组)

    xiaoxiao2021-03-25  89

    #include<iostream> #include<algorithm> #include<vector> #include<map> #include<cstdio> #include<cmath> using namespace std; const int maxn=507; const double eps=1e-7; double A[2*maxn][maxn]; //增广矩阵 double x[maxn]; //解集 //equ: 方程个数 var:变元个数 int Gauss(int equ,int var) { //-1:无解 0:有唯一解 大于0:有多解,返回自由变元个数 int row,col; for(row=0,col=0; col<var&&row<equ; col++,row++) { int max_r=row; for(int i=row+1; i<equ; i++) { if(fabs(A[i][col])>fabs(A[max_r][col])) { max_r=i; } } if(max_r!=row) { for(int j=col; j<var+1; j++) swap(A[row][j],A[max_r][j]); } if(fabs(A[row][col])<eps) { row--; continue; } for(int i=row+1; i<equ; i++) { if(fabs(A[i][col])<eps)continue; for(int j=col+1; j<var+1; j++) { A[i][j]=(A[i][j]*A[row][col]-A[i][col]*A[row][j])/A[row][col]; } A[i][col]=0; } } for(int i=row; i<equ; i++) { if(fabs(A[i][col])>eps)return -1; } if(row<var)return var-row; for(int i=var-1; i>=0; i--) { //计算唯一解。 double tmp=0; for(int j=i+1; j<var; j++) { tmp+=A[i][j]*x[j]; } x[i]=(A[i][var]-tmp)/A[i][i]; } return 0; } int main() { // freopen("in.txt","r",stdin); int equ,var; while(cin>>var>>equ) { for(int i=0; i<equ; i++) { for(int j=0; j<=var; j++) { cin>>A[i][j]; } } int ans=Gauss(equ,var); if(ans==-1) cout<<"No solutions"<<endl; else if(ans>0) cout<<"Many solutions"<<endl; else { for(int i=0; i<var; i++) cout<<(int)(x[i]+0.5)<<endl; //输出整数解记得四舍五入 } } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-15196.html

    最新回复(0)