日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【高斯消元板子】

發(fā)布時(shí)間:2025/4/16 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【高斯消元板子】 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
#include<stdio.h>///poj 2947當(dāng)作板子可能更好一下 #include<algorithm> #include<iostream> #include<string.h> #include<math.h> using namespace std; const int MAXN=50; int a[MAXN][MAXN];//增廣矩陣 int x[MAXN];//解集 bool free_x[MAXN];//標(biāo)記是否是不確定的變?cè)?inline int gcd(int a,int b) {int t;while(b!=0){t=b;b=a%b;a=t;}return a; } inline int lcm(int a,int b) {return a/gcd(a,b)*b;//先除后乘防溢出 }// 高斯消元法解方程組(Gauss-Jordan elimination).(-2表示有浮點(diǎn)數(shù)解,但無整數(shù)解, //-1表示無解,0表示唯一解,大于0表示無窮解,并返回自由變?cè)膫€(gè)數(shù)) //有equ個(gè)方程,var個(gè)變?cè)?。增廣矩陣行數(shù)為equ,分別為0到equ-1,列數(shù)為var+1,分別為0到var. int Gauss(int equ,int var) {int i,j,k;int max_r;// 當(dāng)前這列絕對(duì)值最大的行.int col;//當(dāng)前處理的列int ta,tb;int LCM;int temp;int free_x_num;int free_index;for(int i=0;i<=var;i++){x[i]=0;free_x[i]=true;}//轉(zhuǎn)換為階梯陣.col=0; // 當(dāng)前處理的列for(k = 0;k < equ && col < var;k++,col++){// 枚舉當(dāng)前處理的行. // 找到該col列元素絕對(duì)值最大的那行與第k行交換.(為了在除法時(shí)減小誤差)max_r=k;for(i=k+1;i<equ;i++){if(abs(a[i][col])>abs(a[max_r][col])) max_r=i;}if(max_r!=k)///當(dāng)作為最簡(jiǎn)階梯型(前面的都是0)來進(jìn)行變換的,下面的思想也是{// 與第k行交換. 交換的是原先第k行第k列到第k行最后一列的數(shù)值for(j=k;j<var+1;j++) swap(a[k][j],a[max_r][j]);}if(a[k][col]==0){// 交換完還是0,說明該col列第k行以下全是0了,則處理當(dāng)前行的下一列.k--;//free_x[free_num++]=col;//這個(gè)是自由元continue;}for(i=k+1;i<equ;i++){// 枚舉要?jiǎng)h去的行.if(a[i][col]!=0){LCM = lcm(abs(a[i][col]),abs(a[k][col]));ta = LCM/abs(a[i][col]);tb = LCM/abs(a[k][col]);if(a[i][col]*a[k][col]<0)tb=-tb;//異號(hào)的情況是相加for(j=col;j<var+1;j++){a[i][j] = a[i][j]*ta-a[k][j]*tb;}}}}// 1. 無解的情況: 化簡(jiǎn)的增廣陣中存在(0, 0, ..., a)這樣的行(a != 0).for (i = k; i < equ; i++){ // 對(duì)于無窮解來說,如果要判斷哪些是自由變?cè)?#xff0c;那么初等行變換中的交換就會(huì)影響,則要記錄交換.if (a[i][col] != 0) return -1;///此時(shí)col在于常量部分}// 2. 無窮解的情況: 在var * (var + 1)的增廣陣中出現(xiàn)(0, 0, ..., 0)這樣的行,即說明沒有形成嚴(yán)格的上三角陣.// 且出現(xiàn)的行數(shù)即為自由變?cè)膫€(gè)數(shù).if (k < var){// 這個(gè)時(shí)候已經(jīng)是有無窮多個(gè)解了(k<var),首先,自由變?cè)衯ar - k個(gè),即不確定的變?cè)辽儆衯ar - k個(gè).for (i = k - 1; i >= 0; i--){// 第i行一定不會(huì)是(0, 0, ..., 0)的情況,因?yàn)檫@樣的行是在第k行到第equ行.// 同樣, 第i行一定不會(huì)是(0, 0, ..., a), a != 0的情況,這樣的無解的.free_x_num = 0; // 用于判斷該行中的不確定的變?cè)膫€(gè)數(shù),如果超過1個(gè),則無法求解,它們?nèi)匀粸椴淮_定的變?cè)?for (j = 0; j < var; j++){if (a[i][j] != 0 && free_x[j]) free_x_num++, free_index = j;}if (free_x_num > 1) continue; // 無法求解出確定的變?cè)?// 說明就只有一個(gè)不確定的變?cè)猣ree_index,那么可以求解出該變?cè)?#xff0c;且該變?cè)谴_定的.temp = a[i][var];for (j = 0; j < var; j++){if (a[i][j] != 0 && j != free_index) temp -= a[i][j] * x[j];}x[free_index] = temp / a[i][free_index]; // 求出該變?cè)?free_x[free_index] = false; // 該變?cè)谴_定的.}return var - k; // 自由變?cè)衯ar - k個(gè).}// 3. 唯一解的情況: 在var * (var + 1)的增廣陣中形成嚴(yán)格的上三角陣.// 計(jì)算出Xn-1, Xn-2 ... X0.for (i = var - 1; i >= 0; i--){temp = a[i][var];for (j = i + 1; j < var; j++){if (a[i][j] != 0) temp -= a[i][j] * x[j];}///poj2065 bin神的這個(gè)模板感覺在判斷有浮點(diǎn)數(shù)解,無整數(shù)解的時(shí)候有bug啊if (temp % a[i][i] != 0) return -2; // 說明有浮點(diǎn)數(shù)解,但無整數(shù)解./// int d=inv_exgcd(a[i][i],7); if(d==-1)return -2; ///當(dāng)逆元=-1是也是無整數(shù)解(求逆元又必須是互質(zhì)的情況下)///感覺同時(shí)寫上這兩個(gè)比較好x[i] = temp / a[i][i];}return 0; } int main(void) {freopen("in.txt", "r", stdin);freopen("out.txt","w",stdout);int i, j;int equ,var;while (scanf("%d %d", &equ, &var) != EOF){memset(a, 0, sizeof(a));for (i = 0; i < equ; i++){for (j = 0; j < var + 1; j++){scanf("%d", &a[i][j]);}} // Debug();int free_num = Gauss(equ,var);if (free_num == -1) printf("無解!\n");else if (free_num == -2) printf("有浮點(diǎn)數(shù)解,無整數(shù)解!\n");else if (free_num > 0){printf("無窮多解! 自由變?cè)獋€(gè)數(shù)為%d\n", free_num);for (i = 0; i < var; i++){if (free_x[i]) printf("x%d 是不確定的\n", i + 1);else printf("x%d: %d\n", i + 1, x[i]);}}else{for (i = 0; i < var; i++){printf("x%d: %d\n", i + 1, x[i]);}}printf("\n");}return 0; }

?

總結(jié)

以上是生活随笔為你收集整理的【高斯消元板子】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。