本文主要是介绍行列式求解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
行列式
给出一个矩阵求 行列式。
输入:
1
3
1 -2 -1
0 3 2
3 1 -1
思路:
不能直接乘上上面行的倍数来消除本行对应元素。试试辗转相减法把。
(1,3)减去2倍(0,1)->(1,0)
(5,3)减去0倍(3,5)减去1倍(2,3)减去1倍(1,2)减去2倍(0,1)->(1,0)
然后每次检查上面行的元素是否为0,然后换回来就行了
#include <bits/stdc++.h>
using namespace std;
const int mod=0x1f1f1f1f;
typedef long long ll;
ll t,n,a[10][10];
ll solve(){//计算行列式,化简成下三角型(有点类似辗转相除法)ll res=1,w=1;//res是结果,w是符号for(int i=1;i<=n;i++){//对[i][i]元素所在的列处理for(int j=i+1;j<=n;j++){
//我们每次都让下面的行减去上面行的a[j][i]/a[i][i]倍,然后再让最小的行放到上面判断是不是[i][i]是不是0,如果不是就继续。while(a[i][i]){ll di=a[j][i]/a[i][i];for(int k=i;k<=n;k++){a[j][k]=(a[j][k]-di*a[i][k]%mod+mod)%mod;//有负数的话要加一次mod}swap(a[i],a[j]);w=-w;}swap(a[i],a[j]);w=-w;}}for(int i=1;i<=n;i++)res=a[i][i]*res%mod;res=w*res;return (res+mod)%mod;
}int main(){cin>>t;while(t--){cin>>n;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)cin>>a[i][j];cout<<solve()<<'\n';}
}
这篇关于行列式求解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!