高斯消元模板
阿新 • • 發佈:2018-08-12
solution efi ret return space span 博客 () 高斯消元
詳解參照其他博客,簡單模板如下
1 /*處理出的倒三角是這個形狀的 2 x1 x2 x3=.. 3 x2 x3=.. 4 x3=.. 5 */ 6 #include<bits/stdc++.h> 7 #define N 205 8 using namespace std; 9 const double eps=1e-8; 10 int n; 11 double a[N][N],del; 12 bool gauss(){ 13 for(int i=1;i<=n;i++){//處理第i列,行也處理到i 14 int k=i;//i:當前處理的列 和 行15 for(int j=i+1;j<=n;j++)if(fabs(a[j][i])>fabs(a[k][i]))k=j;//找到i列最大的系數在的行 16 if(fabs(del=a[k][i])<eps)return 0;//最大數的行都為0,無解或多解 del:i列最大系數 17 for(int j=i;j<=n+1;j++)swap(a[i][j],a[k][j]);//交換兩行,將大的換到上面去,底下開始消元 18 for(int j=i;j<=n+1;j++)a[i][j]/=del;//最大系數化為 119 for(k=1;k<=n;k++)if(k!=i){ 20 del=a[k][i]; 21 for(int j=i;j<=n+1;j++)a[k][j]-=a[i][j]*del;//也可看做a[k][j]=a[k][j]/del-a[i][j] 22 //即把a[k][i]也系數化為1,再減去i行,顯然k的第i列變成0了,即達到了消元的目的 23 } 24 } 25 return 1; 26 } 27 int main(){ 28 scanf("%d",&n);29 for(int i=1;i<=n;i++) 30 for(int j=1;j<=n+1;j++) 31 scanf("%lf",&a[i][j]); 32 bool flag=gauss(); 33 if(!flag) puts("No Solution"); 34 else 35 { 36 for(int i=1;i<=n;i++) 37 printf("%.2lf\n",a[i][n+1]); 38 } 39 return 0; 40 }
高斯消元模板