#include<iostream.h>
#include<fstream.h>
#include<cmath>
void main()
{
//輸入行列式開始
int n,i,j,a[20][20],T[20],max[20],b[20],k,q,p,f=2,u=0;
float t[20][20],c,sum=1,w[20];
cout<<"階數:";
cin>>n;
ifstream infile; //定義輸入文件類
ofstream outfile; //定義輸出文件類
infile.open("D:\\考試題目.txt"); //打開一個輸入文件“考試題目.txt”
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
infile>>a[i][j];//將“考試題目.txt”中的十個整型數輸入到a[i]中
}
}
infile.close();//關閉輸入文件
//輸入行列式階數
for(j=1;j<=n;j++)//從第一列開始找起
{
T[j]=0; //將計數器初始化為0
for(i=1;i<=n;i++)
{
if(a[i][j]==0)//在j列中每找到一個0就計數
{
T[j]++;//統計第j列中0的個數
}
}
}
outfile.open("D:\\答案.txt"); //打開一個輸出文件“答案.txt”
//此循環結束後已經將每列的0的個數存儲到數組T[j]中
//開始比較每列0的個數並排列
for(i=1;i<=n;i++)//經過n次循環將T[j]從大到小排列
{
max[i]=-100;
for(j=1;j<=n;j++)
{
max[i]=(max[i]>T[j])?max[i]:T[j];
}
//找出第i個最大值
for(j=1;j<=n;j++)//通過一個循環找到第i個最大值對應的列數j j是對應的列數
{
if(max[i]==T[j])
{
T[j]=-200;//將T[j]設為較小的數
//outfile<<"第"<<j<<"列:"<<max[i]<<"個0"<<endl;
b[i]=j;
break;
}
}
}
outfile<<"------------------------------------行列式答案-------------------------------------"<<endl;
//打印新的行列式
outfile<<"第1步:換列:"<<endl;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
t[i][j]=float(a[i][b[j]]);
//判斷換列次數
if(i==1&&j!=b[j])
{
u++;
}
outfile<<t[i][j]<<" ";
}
outfile<<endl;
}
//判斷第一個數是0的特殊情況的解決辦法
if(t[1][1]==0)
{
for(i=2;i<=n;i++)
{
if(t[i][1]!=0)
{
for(j=1;j<=n;j++)
{
w[j]=t[i][j];
t[i][j]=t[1][j];
t[1][j]=w[j];
}
break;
}
}
u++;
}
//換列結束,將新的行列式重新存儲在一個新的數組中t[][]
for(j=1;j<n;j++)//列
{
for(k=j+1;k<=n;k++)//j列需化為0的行
{
if(t[k][j]!=0)
{
for(i=j;i<=n;i++)//行
{
if(t[i][j]!=0&&i!=k)
{
p=0;
c=float(t[k][j]/t[i][j]);
for(q=1;q<=n;q++)//列
{
t[k][q]=t[k][q]-c*t[i][q];
if(abs(t[k][q])<0.0001&&k!=q)
{
t[k][q]=0;
}
p++;
}
//打印中間過程
outfile<<"第"<<f++<<"步:r["<<k<<"]-"<<c<<"r["<<i<<"]:"<<endl;
for(int s=1;s<=n;s++)
{
for(int d=1;d<=n;d++)
{
outfile<<t[s][d]<<" ";
}
outfile<<endl;
}
if(p==n)
{
break;
}
}
}
}
}
}
for(i=1;i<=n;i++)
{
sum=t[i][i]*sum;
}
outfile<<"第"<<f++<<"步:"<<endl;
if(u!=0)
{
u=u-1;
}
outfile<<"該行列式最終結果="<<sum*pow(-1,u)<<endl;
outfile.close();//關閉輸出文件
}