[SDOI2006] 线性方程组
刚开始写了个消成上三角的,结果狂wa。
后来经过研究发现,消成上三角那种不能直接判断无解或无穷多解,需要其它的操作。
所以干脆学了个消成对角线的,写了一发A了。
其实两种消元的方法都差不多,就当存个板子吧。
1 #include<cstdio> 2 3 void swap(double &x,double &y) 4 { 5 double t=x;x=y;y=t; 6 } 7 8 double v(double rx) 9 { 10 return rx>0?rx:(-rx); 11 } 12 13 int n; 14 double a[55][55]; 15 double x[55]; 16 const double eps=0.00001; 17 18 int main() 19 { 20 scanf("%d",&n); 21 for(int i=1;i<=n;i++) 22 for(int j=1;j<=n+1;j++) 23 scanf("%lf",&a[i][j]); 24 for(int i=1;i<=n;i++) 25 { 26 int p=i; 27 for(int j=i+1;j<=n;j++) 28 if(v(a[j][i])>v(a[p][i]))p=j; 29 if(i!=p)for(int j=i;j<=n+1;j++)swap(a[i][j],a[p][j]); 30 if(v(a[i][i])<eps)continue; 31 double div=a[i][i]; 32 for(int j=i;j<=n+1;j++)a[i][j]/=div; 33 for(int j=1;j<=n;j++) 34 { 35 if(i==j)continue; 36 double div=a[j][i]; 37 for(int k=1;k<=n+1;k++) 38 a[j][k]-=div*a[i][k]; 39 } 40 } 41 int no=0,inf=0; 42 for(int i=1;i<=n;i++) 43 { 44 int p=1; 45 while(p<=n+1&&v(a[i][p])<=eps)p++; 46 if(p==n+1)no=1; 47 if(p>n+1)inf=1; 48 } 49 if(no){printf("-1");return 0;} 50 if(inf){printf("0");return 0;} 51 for(int i=n;i;i--)x[i]=a[i][n+1]; 52 for(int i=1;i<=n;i++) 53 printf("x%d=%.2lf\n",i,x[i]); 54 return 0; 55 }