• uva 684 Integral Determinant 行列式求值


    题目链接: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个行列式的和。
    性质5:行列式某一行(列)各元素乘以同一个数加到另一行(列)对应元素上,行列式不变。
     
    可以把原来的行列式转化成上三角或者下三角行列式,那么行列式的值就是对角线的乘积。
     
     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 }
  • 相关阅读:
    八数码
    狂神说笔记——多线程05
    狂神说笔记——Java SE基础03
    从零开始的卷积神经网络
    深度学习与机器学习的区别
    模型的评估与选择
    经验风险VS风险函数
    常见的损失函数
    Erlang聊天室
    uniapp APP端 清除缓存
  • 原文地址:https://www.cnblogs.com/titicia/p/5297599.html
Copyright © 2020-2023  润新知