高斯消元
高斯消元最朴素的板子......
求解线性方程组。
先转换为增广矩阵。
从上到下一行一行消元呗。
每次挑个首列最大的行消。
求出来可能不是整数,要用double。
具体看代码。
最后求出来xn之后回带求出x1、x2......xn-1。
给个洛谷的模板题链接:传送门
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 6 int n; 7 double c[105][105]; 8 double x[105]; 9 double eps=1e-7; 10 11 double v(double rx) 12 { 13 return rx>0?rx:-rx; 14 } 15 16 int main() 17 { 18 scanf("%d",&n); 19 for(int i=1;i<=n;i++) 20 for(int j=1;j<=n+1;j++) 21 scanf("%lf",&c[i][j]); 22 for(int i=1;i<=n;i++) 23 { 24 int p=i; 25 for(int j=i+1;j<=n;j++) 26 if(v(c[j][i])>v(c[p][i]))p=j; 27 if(v(c[p][i])<eps) 28 { 29 printf("No Solution"); 30 return 0; 31 } 32 if(i!=p) 33 { 34 for(int j=i;j<=n+1;j++) 35 swap(c[i][j],c[p][j]); 36 } 37 double div=c[i][i]; 38 for(int j=i;j<=n+1;j++) 39 c[i][j]/=div; 40 for(int j=i+1;j<=n;j++) 41 { 42 div=c[j][i]; 43 for(int k=i;k<=n+1;k++) 44 c[j][k]-=c[i][k]*div; 45 } 46 } 47 x[n]=c[n][n+1]; 48 for(int i=n-1;i;i--) 49 { 50 x[i]=c[i][n+1]; 51 for(int j=i+1;j<=n;j++) 52 x[i]-=c[i][j]*x[j]; 53 } 54 for(int i=1;i<=n;i++) 55 printf("%.2lf\n",x[i]); 56 return 0; 57 }
这样就OK啦。