U66785 行列式求值
生活随笔
收集整理的這篇文章主要介紹了
U66785 行列式求值
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
二更:把更多的行列式有關內容加了進來(%%%%%Jelly Goat奆佬)
題目描述
給你一個N(n≤10n\leq 10n≤10)階行列式,請計算出它的值
輸入輸出格式
輸入格式:
第一行有一個整數n
在以下n行中,每行有n個整數,表示該行列式
輸出格式:
這個行列式的值
輸入輸出樣例
輸入樣例#1:? 8 2 10 4 4 3 6 10 6 1 10 9 3 2 1 6 7 3 9 8 7 1 1 8 7 2 10 8 6 9 9 3 4 1 7 1 8 2 6 2 3 9 2 4 8 10 6 10 3 3 6 7 9 8 2 8 1 2 9 2 1 10 7 4 5 輸出樣例#1: -135742 輸入樣例#2:? 4 1 2 3 4 1 3 4 1 1 4 1 2 1 1 2 3 輸出樣例#2:? 16首先這是一道非常簡單的板子題,他耗費了我兩天將近兩個多小時的時間,那么我們就來細細分析一下這道題
思路大致如下:
按照高斯消元法,把行列式消成下三角,然后按照公式直接求對角線乘積即為答案
有這么幾個坑
1.忘記用double類型,因為行列式做除法的時候肯定是要出小數的,不用double肯定gg
2.沒有注意當a[i][i]==0的時候,我們沒法按照公式把它下面消為零,所以需要一個換行操作
代碼如下
while (a[i][i] == 0 && sum<=n) //對是否a[i][i]是0的特判 {CH2(i, sum + 1); //交換x列和y列ans *= -1;sum++;} 3.輸出的時候忘記控制精度,其實原因是這樣的,在小數點后位數多于18個之后,c++會自動轉成科學計數法。。。。。。
但是洛谷不認啊喂!!!!!!!,所以輸出的時候手動控制一下就好
printf("%0.0lf", ans); 4.各種奇奇怪怪的諸如循環控制寫錯了或者是while條件判錯了的詭異失誤,導致我掛了整整五次
不過這種經歷也的確是能讓我深刻的記住這道題了吧。
現在貼一下AC代碼 #include <iostream> #include <string> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; double n, a[20][20], ans = 1; int sum; inline void CH1(int x, int y, double k) //第y行減k*x {for (int i = 1; i <= n; ++i)a[y][i] -= (double)(k * a[x][i]); } inline void CH2(int x, int y) //交換x列和y列 {for (int i = 1; i <= n; ++i)swap(a[i][x], a[i][y]); } inline double CH3(int x, double k) //把第x行提出一個公因數k {for (int i = 1; i <= n; ++i)a[x][i] /= k;return k; } int main() {scanf("%lf", &n);for (int i = 1; i <= n; ++i)for (int j = 1; j <= n; ++j)scanf("%lf", &a[i][j]);for (int i = 1; i < n; ++i){ sum=i;while (a[i][i] == 0 && sum<=n) //對是否a[i][i]是0的特判 {CH2(i, sum + 1); //交換x列和y列ans *= -1;sum++;}ans *= CH3(i, a[i][i]);for (int j = i + 1; j <= n; ++j)CH1(i, j, a[j][i]);}for (int i = 1; i <= n; ++i)ans *= a[i][i];printf("%0.0lf", ans);return 0; }
?
??
轉載于:https://www.cnblogs.com/this-is-M/p/10698562.html
總結
以上是生活随笔為你收集整理的U66785 行列式求值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 变量 和 注释
- 下一篇: 紫书 团队队列(队列)