行列式計算的兩種方法

#include<iostream> 
#include<cstring>
#include<cstdio>
#include<algorithm>
#define N 100 
using namespace std;
int a[N][N];
double aa[N][N];
int n;/**********************************************************/
//求行列式的值:是所有取自不同行不同列的n個元素的乘積 
int d[N];
int tmpd[N]; 
int dd[N];
int vis_column[N];//是否在同一列 
int inverse;//逆序數的個數 
int ans = 0;
void merger(int ld, int rd){if(ld >= rd) return;int mid=(ld+rd)>>1;merger(ld,mid);merger(mid+1, rd);int i=ld, j=mid+1, k=0;while(i<=mid && j<=rd){int col1 = (tmpd[i]-1)%n+1;int col2 = (tmpd[j]-1)%n+1;if(col1 < col2){dd[++k] = tmpd[i++];} else {dd[++k] = tmpd[j++];inverse += mid-i+1; }}while(i<=mid) dd[++k] = tmpd[i++];while(j<=rd) dd[++k] = tmpd[j++];memcpy(tmpd+ld, dd+1, sizeof(int)*(k));
}void determinantValue(int row){if(row>n){inverse=0; int tmp = 1;for(int k=1; k<=n; ++k){int i = (d[k]-1)/n+1;int j = (d[k]-1)%n+1;tmp *= a[i][j];}memcpy(tmpd, d, sizeof(int)*(n+1));merger(1, n);if(inverse&1) ans-=tmp;else ans+=tmp;return;}for(int col=1; col<=n; ++col)if(!vis_column[col]){vis_column[col]=1;d[row] = (row-1)*n + col;determinantValue(row+1);vis_column[col]=0;}
}
/**********************************************************//**********************************************************/
//以列主元方法,將行列式轉變成上三角矩陣double determinantValueA(){int sign = 1;double ret = 0.0;for(int i=1; i<=n; ++i){double maxVal = aa[i][i];int j = i;for(int k=i+1; k<=n; ++k)//尋找這一列中的元素值的最大值 if(maxVal < aa[k][i]){maxVal = aa[k][i];j = k;}if(j!=i){sign = -sign;for(int k=1; k<=n; ++k){//交換兩行 double tmp = aa[i][k];aa[i][k] = aa[j][k];                 aa[j][k] = tmp;}}if(maxVal < 1e-10)//最大值為0,也就是意味這對角線上的元素有0出現 return ret;for(int k=i+1; k<=n; ++k){double b = aa[k][i]/aa[i][i];for(int c=1; c<=n; ++c) aa[k][c] -= b*aa[i][c];}}ret = 1.0;for(int i=1; i<=n; ++i)ret*=aa[i][i];return ret;
}/**********************************************************/
int main() {
//    cin>>n;
//    for(int i=1; i<=n; ++i)
//        for(int j=1; j<=n; ++j)
//            cin>>a[i][j];
//    determinantValue(1);
//    cout<<ans<<endl;
    cin>>n;for(int i=1; i<=n; ++i)for(int j=1; j<=n; ++j)cin>>aa[i][j];cout<<determinantValueA()<<endl;return 0;
}
/*
4
3 4 5 11
2 5 4 9
5 3 2 12
14 -11 21 294
2 0 0 0
0 2 0 0
0 0 2 0
0 0 0 2 2
1 2 3 4
*/

?

轉載于:https://www.cnblogs.com/hujunzheng/p/4771380.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/531436.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531436.shtml
英文地址,請注明出處:http://en.pswp.cn/news/531436.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

uboot啟動流程分析

Uboot的啟動流程分為兩個階段&#xff0c;第一階段主要是匯編語言編寫&#xff0c;第二階段是C語言編寫&#xff0c;每個階段所做的工作不同&#xff0c;這篇文章分析的是uboot 2010版&#xff0c;以tiny4412的uboot為例。 啟動過程涉及的主要文件&#xff1a; arch/arm/cpu/a…

(一)uboot的移植與制作

目錄&#xff08;一&#xff09;環境&#xff08;二&#xff09;流程分析&#xff08;三&#xff09;具體步驟在裸機啟動流程里涉及到BL1&#xff0c;BL2為系統的加載啟動項&#xff0c;全稱為BootLoader。 Boot Loader 是在操作系統內核運行之前運行的一段小程序。通過這段小程…

jquery ajax(實現單獨提交某個form)

function submitTaskScore(formid) {//formid表示的是表單的id$.ajax({type:"post",url:"companyAndDistributeAction!scoreTask",//后臺處理程序data:$(formid).serialize(),success:function(){document.getElementById("hjzggContent").inner…

(二)linux內核鏡像制作

&#xff08;一&#xff09;目的 在進行嵌入式開發的時候&#xff0c;我們往往會先在電腦上安裝交叉編譯器&#xff0c;然后編譯目標板上的代碼&#xff0c;最后把代碼下載到電路板中&#xff0c;嵌入式系統組成包括&#xff1a;BootLoaderkernelfilesystemapplication&#x…

js+css實現骰子的隨機轉動

網上找的例子&#xff0c;然后增添了新的東西&#xff0c;在這里展示一下...... 效果圖預覽&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html x…

linux安裝交叉編譯環境

&#xff08;一&#xff09;交叉編譯器的簡介 &#xff08;1&#xff09;本地編譯 在了解交叉編譯之前我們首先介紹一下另一個概念&#xff1a;本地編譯 之前所做的C開發屬于本地編譯&#xff0c;即在當前PC下&#xff08;x86的CPU下&#xff09;&#xff0c;直接編譯出可以運…

jsp實現郵件的發送

如果程序出現 454 Authentication failed, please open smtp flag first! 錯誤&#xff0c;那么一般是郵箱沒有開通POP3/SMTP服務&#xff0c;登錄郵箱&#xff0c;在設置中開啟該服務即可 &#xff01; 另外需要的jar包如下: imap.jar, mail.jar, smtp.jar, 可以自己在網上下…

linux的mount和umount指令使用

mount即掛在操作&#xff0c;磁盤或分區創建好文件系統后需要掛載到一個目錄&#xff08;一般mount在/mnt下&#xff09;才能使 用&#xff0c;和winsdows不同的是在linux下需要手動掛載。 用法&#xff1a;mount [-t文件系統] [選項] 設備目錄注意&#xff1a;[ ]為可選項…

斐波那契的四種求法

首先看一下斐波那契的矩陣表示&#xff1a; 數列的遞推公式為&#xff1a;f(1)1&#xff0c;f(2)2&#xff0c;f(n)f(n-1)f(n-2)(n>3) 用矩陣表示為&#xff1a; 進一步&#xff0c;可以得出直接推導公式&#xff1a; #include<iostream> #include<cstring> #i…

利用STM32制作紅外測溫儀之軟件設計(MLX90614)

目錄&#xff08;一&#xff09;工程目錄如圖&#xff1a;&#xff08;二&#xff09;main函數實現&#xff1a;&#xff08;三&#xff09;MLX90614測溫代碼實現前面介紹了使用 STM32制作紅外測溫儀硬件設計,今天來說一下軟件的實現&#xff0c;具體的程序&#xff0c;完整的k…

Windows下使用Dev-C++開發基于pthread.h的多線程程序

一、下載Windows版本的pthread 目前最新版本是&#xff1a;pthreads-w32-2-9-1-release.zip。 二、解壓pthread到指定目錄 我選擇的目錄是&#xff1a;E:\DEV-CPP\Pthread完成后&#xff0c;該目錄會多出三個文件夾&#xff1a;Pre-built.2&#xff0c;pthreads.2&#xff0c;Q…

(三)linux之根文件系統的制作

&#xff08;一&#xff09;準備工作 Ubuntu 16.04系統linux-3.5內核:linux-3.5-20190929交叉編譯工具arm-linux-gcc-4.5.1-v6-vfp-20120301.rarbusybox源碼包&#xff1a;busybox-1.21.1.rar &#xff08;二&#xff09;工具介紹 &#xff08;1&#xff09;交叉編譯器 這個…

c/c++多線程模擬系統資源分配(并通過銀行家算法避免死鎖產生)

銀行家算法數據結構 &#xff08;1&#xff09;可利用資源向量Available 是個含有m個元素的數組&#xff0c;其中的每一個元素代表一類可利用的資源數目。如果Available[j]K&#xff0c;則表示系統中現有Rj類資源K個。 &#xff08;2&#xff09;最大需求矩陣Max 這是一個nm的…

(四)Linux內核模塊化編程

目錄&#xff08;一&#xff09;模塊化編程簡介&#xff08;二&#xff09;安裝卸載模塊命令.&#xff08;三&#xff09;將自定義功能添加到內核三種方法&#xff08;1&#xff09;修改Kconfig和Makefile&#xff08;2&#xff09;直接修改功能對應目錄下的Makefile文件&#…

基于X86平臺的PC機通過網絡發送一個int(32位)整數的字節順序

1.字節順序  字節順序是指占內存多于一個字節類型的數據在內存中的存放順序&#xff0c;通常有小端、大端兩種字節順序。小端字節序指低字節數據存放在內存低地址處&#xff0c;高字節數據存放在內存高地址處&#xff1b;大端字節序是高字節數據存放在低地址處&#xff0c;低字…

Linux內核空間和用戶空間

在Linux系統中存在進程的概念&#xff1a; 進程的分類&#xff1a; 用戶進程&#xff1a;運行在用戶空間的進程被稱為用戶進程 內核進程:運行在內核空間的進程被稱為內核進程 進程的空間&#xff1a; 系統會為每一個進程分0-4G的虛擬尋址空間&#xff0c;在4G的空間中 0-3G&…

codeforces Round #320 (Div. 2) C. A Problem about Polyline(數學) D. Or Game(暴力,數學)

解題思路&#xff1a;就是求數 n 對應的二進制數中有多少個 1 #include <iostream> #include<cstdio> using namespace std; int main(){int n;cin>>n;int ans 0; // while(n){//這也是一種好的方法 // n n&(n-1); // ans; // }while(n…

(五)Linux之設備驅動模型

目錄&#xff08;一&#xff09;Linux內核驅動簡介&#xff08;二&#xff09;雜項設備驅動模型&#xff08;1&#xff09;相關接口&#xff08;2&#xff09;雜項設備注冊過程&#xff08;三&#xff09;早期經典字符設備驅動模型&#xff08;1&#xff09;相關接口&#xff0…

操作系統頁面置換算法(opt,lru,fifo,clock)實現

選擇調出頁面的算法就稱為頁面置換算法。好的頁面置換算法應有較低的頁面更換頻率&#xff0c;也就是說&#xff0c;應將以后不會再訪問或者以后較長時間內不會再訪問的頁面先調出。 常見的置換算法有以下四種&#xff08;以下來自操作系統課本&#xff09;。 1. 最佳置換算法(…

(六)Linux之設備驅動模型(續)

前面我們學習了雜項設備驅動模型、早期經典字符設備驅動模型,這一小節來講解Linux中的標準字符設備驅動。 目錄&#xff08;一&#xff09;為什么引入標準字符設備驅動模型&#xff08;二&#xff09;相關接口&#xff08;三&#xff09;注冊流程&#xff08;四&#xff09;程序…