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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

acwing 高斯消元

發布時間:2023/12/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 acwing 高斯消元 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.高斯消元解線性方程組

輸入一個包含 n 個方程 n 個未知數的線性方程組。

方程組中的系數為實數。

求解這個方程組。

下圖為一個包含 m 個方程 n 個未知數的線性方程組示例:

輸入格式

第一行包含整數 n。

接下來 n 行,每行包含 n+1 個實數,表示一個方程的 n 個系數以及等號右側的常數。

輸出格式

如果給定線性方程組存在唯一解,則輸出共 n 行,其中第 i 行輸出第 i 個未知數的解,結果保留兩位小數。

如果給定線性方程組存在無數解,則輸出 Infinite group solutions。

如果給定線性方程組無解,則輸出 No solution。

數據范圍

1≤n≤100
所有輸入系數以及常數均保留兩位小數,絕對值均不超過100。

輸入樣例:

3 1.00 2.00 -1.00 -6.00 2.00 1.00 -3.00 -9.00 -1.00 -1.00 2.00 7.00

輸出樣例:

1.00 -2.00 3.00

? #include<iostream> #include<cmath> #include<algorithm> #include<cstring> using namespace std; const int N=110; const double eps=1e-8; int n; double a[N][N]; int gauss1() {int c,r ; //行列/*for(c=0,r=0;c<n;c++){int t=r;for(int i=r;i<n;i++){if(fabs(a[i][c])>fabs(a[t][c])){t=i;}}if(fabs(a[t][c])<eps) continue;for(int i=c;i<=n;i++){swap(a[t][i],a[r][i]);}for(int i=n;i>=c;i--){a[r][i]/=a[r][c];}for(int i=r+1;i<n;i++){if(fabs(a[i][c])>eps){for(int j=n;i>=c;j--){a[i][j]-=a[i][c]*a[r][j];}}}r++;}*/for (c = 0, r = 0; c < n; c ++ ){int t = r;for (int i = r; i < n; i ++ ) // 找絕對值最大的行if (fabs(a[i][c]) > fabs(a[t][c]))t = i;if (fabs(a[t][c]) < eps) continue;for (int i = c; i <= n; i ++ ) swap(a[t][i], a[r][i]); // 將絕對值最大的行換到最頂端for (int i = n; i >= c; i -- ) a[r][i] /= a[r][c]; // 將當前行的首位變成1for (int i = r + 1; i < n; i ++ ) // 用當前行將下面所有的列消成0if (fabs(a[i][c]) > eps)for (int j = n; j >= c; j -- )a[i][j] -= a[r][j] * a[i][c];r ++ ;}if(r<n){for(int i=r;i<n;i++){if(fabs(a[i][n]>eps)){return 2;}}return 1;}for(int i=n-1;i>=0;i--){for(int j=i+1;j<n;j++){a[i][n]-=a[i][j]*a[j][n];}}return 0; } int gauss() // 高斯消元,答案存于a[i][n]中,0 <= i < n {int c, r;for (c = 0, r = 0; c < n; c ++ ){int t = r;for (int i = r; i < n; i ++ ) // 找絕對值最大的行if (fabs(a[i][c]) > fabs(a[t][c]))t = i;if (fabs(a[t][c]) < eps) continue;for (int i = c; i <= n; i ++ ) swap(a[t][i], a[r][i]); // 將絕對值最大的行換到最頂端for (int i = n; i >= c; i -- ) a[r][i] /= a[r][c]; // 將當前行的首位變成1for (int i = r + 1; i < n; i ++ ) // 用當前行將下面所有的列消成0if (fabs(a[i][c]) > eps)for (int j = n; j >= c; j -- )a[i][j] -= a[r][j] * a[i][c];r ++ ;}if (r < n){for (int i = r; i < n; i ++ )if (fabs(a[i][n]) > eps)return 2; // 無解return 1; // 有無窮多組解}for (int i = n - 1; i >= 0; i -- )for (int j = i + 1; j < n; j ++ )a[i][n] -= a[i][j] * a[j][n];return 0; // 有唯一解 }int main() {scanf("%d", &n);for (int i = 0; i < n; i ++ )for (int j = 0; j < n + 1; j ++ )scanf("%lf", &a[i][j]);int t = gauss1();if (t == 2) puts("No solution");else if (t == 1) puts("Infinite group solutions");else{for (int i = 0; i < n; i ++ ){if (fabs(a[i][n]) < eps) a[i][n] = 0; // 去掉輸出 -0.00 的情況printf("%.2lf\n", a[i][n]);}}return 0; }?

?

2.高斯消元解異或線性方程組

#include<iostream> #include<cstring> #include<algorithm> using namespace std; const int N=110; int a[N][N]; int n; int gauss() {int c,r; //定義行、列for(c=0,r=0;c<n;c++) //遍歷所有列{int t=r;for(int i=r;i<n;i++){if(a[i][c]) //找到非零行{t=i; break;}}if(!a[t][c]) continue; //如果找不到非零行,直接下一個循環即可for(int i=c;i<=n;i++) swap(a[r][i],a[t][i]); //將非零行與第一行交換。for(int i=r+1;i<n;i++) //開始將該列下的每一個數消成0;{if(a[i][c]) //如果存在非零行。則進行以下的異或操作來將該行首列異或為0;{for(int j=n;j>=0;j--) //注意要從右往左遍歷{a[i][j]^=a[r][j];}}}r++;}if(r<n) //說明不是唯一解{for(int i=r;i<n;i++){if(a[i][n]) //如果存在沖突,說明無解{return 2;}return 1; //說明有無窮多節}}for(int i=n-1;i>=0;i--){for(int j=i+1;j<n;j++){a[i][n]^=a[i][j]&a[j][n];}}return 0; } int main() { cin>>n;for(int i=0;i<n;i++) //輸入方程數組{for(int j=0;j<n+1;j++){cin>>a[i][j];}}int t=gauss(); //定義一個變量存儲答案if(t==0){for(int i=0;i<n;i++) cout<<a[i][n]<<endl;}else if(t==2) cout<<"No solution"<<endl;else cout<<"Multiple sets of solutions"<<endl;return 0; }

總結

以上是生活随笔為你收集整理的acwing 高斯消元的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。