线性代数:将行列式转化为上三角行列式求值(c/c++)【记录学习】

代码用到线性代数中与行列式有关的三个性质:

1.行列式的某一行乘以K加到行列式的另一行,行列式的结果不变

2.行列式的某两列互换,此时行列式的结果是原行列式结果的相反数

3.若行列式的某一行全为零,则行列式的结果为零

#include<iostream>
#include"cmath"
using namespace std;
int main()
{
	int n,g=0;  //n表示阶数 ,g是计数器记录换了几次列 
	double k1=0;  //k1表示第五个性质的k系数 
	cout<<"输入行列式阶数:"; 
	cin>>n;            
	double a[n+1][n+1]={0};  //第零行第零列 不要 从一开始 
	cout<<"输入行列式:" <<endl; 
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			cin>>a[i][j];
		}
	}
	cout<<"-----------------"<<endl;
	for(int j=1;j<n;j++)    //j为列数,从左开始 
	{
		
		for(int i=j+1;i<=n;i++)   //i为行数,从上开始 
		{
			if(a[j][j]==0)   //如果k系数的分母为零,则需先换合适的列再进行操作 
			{                //换行操作没有换列简单,下面有所体现 
				g++;
				int B,flag=0;
				for(int b=j+1;b<=n;b++)
				{
					if(a[j][b]!=0)
					{
						B=b;     //第j列与第B列交换 
						flag=1;
						break;
					}
				}
				if(flag)
				{
					printf("第%d列与第%d列互换\n",j,B);
				    for(int x=1;x<=n;x++)
				    {
					    double t;
				     	t=a[x][j];
					    a[x][j]=a[x][B];
					    a[x][B]=t;
				    }
				}
				else  //找不到合适的列,说明此时该行的元素全为零,行列式的结果为零 
				      //(对角线元素为零,左边元素为零,右边元素也都是零,行列式结果为零) 
				{     //换行不会有换列这么简单 
					printf("结果为0");
					return 0; 
				}
			
			}
		    double k1=-a[i][j]/a[j][j];   //k系数的分母为对应列的对角线元素,
			                              //分子为对应列下当前行所确定的要变为零的元素,再乘负一 
			for(int k=1;k<=n;k++)   //k为第i行下的第k项
			{
				a[i][k]+=k1*a[j][k];
			}
			printf("\n第%d列第%d行:r%d+=k*r%d\n",j,i,i,j);
				for(int m=1;m<=n;m++)
	            {
		            for(int p=1;p<=n;p++)
		            {
		            	
			            cout<<a[m][p]<<'\t';
		            }
		            printf("\n\n");
	            }
	            printf("-----------------\n");
		}
	}
	double res = 1;
	for(int i=1;i<=n;i++)
	{
		res*=a[i][i];
	}
	double k2=pow(-1,g);
	printf("列互换了%d次,需再乘%.0f\n",g,k2);
	cout<<"行列式计算结果:"<<res*k2<<endl;
	return 0; 
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值