题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=625
题意:给出一个n阶行列式,求值。
思路:模板参考http://blog.csdn.net/zhoufenqin/article/details/7779707:
n阶行列式的性质:
性质1:行列式与他的转置行列式相等。
性质2:互换行列式的两行(列),行列式变号。
推论:若一个行列式中有两行的对应元素(指列标相同的元素)相同,则这个行列式为零。
性质3:行列式中某行的公共因子k,可以将k提到行列式外面来。
推论:行列式中有两行(列)元素对应成比例时,该行列式等于零。
性质4:行列式具有分行(列)相加性。
推论:如果将行列式某一行(列)的每个元素都写成m个数(m为大于2的整数)的和,则此行列式可以写成m个行列式的和。
可以把原来的行列式转化成上三角或者下三角行列式,那么行列式的值就是对角线的乘积。
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 int n; 6 int a[35][35]; 7 void determinant() 8 { 9 int cnt = 0; 10 int ans = 1; 11 for(int i = 1; i <= n; i++) 12 { 13 for(int j = i+1; j <= n; j++) 14 { 15 int x, y; 16 x = i, y = j; 17 while(a[y][i]) 18 { 19 int t = a[x][i] / a[y][i]; 20 for(int k = 1; k <= n; k++) 21 { 22 a[x][k] = a[x][k] - a[y][k]*t; 23 } 24 swap(x, y); 25 } 26 if(x != i) 27 { 28 for(int k = 1; k <= n; k++) 29 { 30 swap(a[x][k], a[y][k]); 31 } 32 cnt ^= 1; 33 } 34 } 35 if(a[i][i] == 0) 36 { 37 ans = 0; break; 38 } 39 else ans *= a[i][i]; 40 } 41 if(cnt) ans *= -1; 42 printf("%d ", ans); 43 } 44 int main() 45 { 46 // freopen("in.txt", "r", stdin); 47 while(scanf("%d", &n)) 48 { 49 if(n == 0) 50 { 51 printf("* "); 52 break; 53 } 54 for(int i = 1; i <= n; i++) 55 { 56 for(int j = 1; j <= n; j++) 57 { 58 scanf("%d", &a[i][j]); 59 } 60 } 61 determinant(); 62 } 63 return 0; 64 }