acwing 高斯消元
生活随笔
收集整理的這篇文章主要介紹了
acwing 高斯消元
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1.高斯消元解線性方程組
輸入一個(gè)包含 n 個(gè)方程 n 個(gè)未知數(shù)的線性方程組。
方程組中的系數(shù)為實(shí)數(shù)。
求解這個(gè)方程組。
下圖為一個(gè)包含 m 個(gè)方程 n 個(gè)未知數(shù)的線性方程組示例:
輸入格式
第一行包含整數(shù) n。
接下來 n 行,每行包含 n+1 個(gè)實(shí)數(shù),表示一個(gè)方程的 n 個(gè)系數(shù)以及等號(hào)右側(cè)的常數(shù)。
輸出格式
如果給定線性方程組存在唯一解,則輸出共 n 行,其中第 i 行輸出第 i 個(gè)未知數(shù)的解,結(jié)果保留兩位小數(shù)。
如果給定線性方程組存在無數(shù)解,則輸出 Infinite group solutions。
如果給定線性方程組無解,則輸出 No solution。
數(shù)據(jù)范圍
1≤n≤100
所有輸入系數(shù)以及常數(shù)均保留兩位小數(shù),絕對值均不超過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]; // 將當(dāng)前行的首位變成1for (int i = r + 1; i < n; i ++ ) // 用當(dāng)前行將下面所有的列消成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]; // 將當(dāng)前行的首位變成1for (int i = r + 1; i < n; i ++ ) // 用當(dāng)前行將下面所有的列消成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; //如果找不到非零行,直接下一個(gè)循環(huán)即可for(int i=c;i<=n;i++) swap(a[r][i],a[t][i]); //將非零行與第一行交換。for(int i=r+1;i<n;i++) //開始將該列下的每一個(gè)數(shù)消成0;{if(a[i][c]) //如果存在非零行。則進(jìn)行以下的異或操作來將該行首列異或?yàn)?;{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; //說明有無窮多節(jié)}}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++) //輸入方程數(shù)組{for(int j=0;j<n+1;j++){cin>>a[i][j];}}int t=gauss(); //定義一個(gè)變量存儲(chǔ)答案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; }總結(jié)
以上是生活随笔為你收集整理的acwing 高斯消元的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 整理收纳的概念和意义
- 下一篇: 列举html5格式,前端HTML5基本格