”上三角“行列式源代码(改良版,添加了几种特殊情况的特殊处理)
#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();//关闭输出文件
#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();//关闭输出文件
}