矩阵逆的计算

第 2328 题  :  矩阵逆的计算
(时间限制为:1000毫秒)

 

    请你设计一个计算器,计算出给你的一个矩阵的逆矩阵。
输入:
输入的第一行表示需要你计算的矩阵个数N(N<50),每个矩阵的第一行为该矩阵的阶数n,接下来的n行,每行为由空格分隔的n个实数。
输出:
如果给定的矩阵有逆,就使用一行输出“Matrix 1 :”,接下来使用n行输出计算的结果,每行输出n个数,每个数之间使用一个空格隔开,输出结果数据保留6位小数;如果没有逆,直接输出“Matrix 1 : NO.”;
 
样例输入:
2
3
1 2 3
2 2 1
3 4 3
3
2 3 -1
-1 3 5
1 6 4
 
样例输出:
Matrix 1 :
1.000000 3.000000 -2.000000
-1.500000 -3.000000 2.500000
1.000000 1.000000 -1.000000
Matrix 2 : NO.
#include<iostream> #include<cmath> #include<iomanip> using namespace std; int n,N,count1; double mat[51][102]; //高斯消元法解方程 bool jiefangchen(int n,int x_num){//n表示方程数目,x_num表示未知数变量数目,mat的第x_num+1列存储常数bi值。 int i,j,m; for(i=0;i<x_num/2;i++){//i列 for(j=i;j<n;j++) if(fabs(mat[j][i])>0.000001)break;//找到第i行第i列为非零 if(j==n)return false; if(j!=i) { for(int t=0;t<x_num;t++)//交换两行 swap(mat[i][t],mat[j][t]); } double a=mat[i][i];//对角线系数化为1 for(m=i;m<x_num;m++) mat[i][m]/=a; //消元法 for(m=0;m<2*n;m++) { if(m==i)continue; double b; b=mat[m][i]; for(int j=i;j<x_num;j++) mat[m][j]-=b*mat[i][j]; } } return true; } int main() { int i,j; count1=0; cin>>N; while(N--) { count1++; cin>>n; for(i=0;i<n;i++) { for(j=0;j<n;j++) cin>>mat[i][j]; } for(i=0;i<n;i++) { for(j=n;j<2*n;j++) { if(j-n==i) { mat[i][j]=1; } else { mat[i][j]=0; } } } if(jiefangchen(n,2*n)) { cout<<"Matrix "<<count1<<" :"<<endl; for(j=0;j<n;j++) { for(i=n;i<2*n;i++)printf("%f ",mat[j][i]); // cout<<setiosflags(ios::fixed)<<setprecision(6)<<mat[j][i]<<" "; cout<<endl; } } else { cout<<"Matrix "<<count1<<" : NO."<<endl; } } return 0; }

你可能感兴趣的:(ios,BI,存储,ini,Matrix)