高斯消元
高斯消元
其实高斯消元有两种写法,这里是精度更高,代码更短的高斯.约旦做法。
思路就是每次选择一个未知数x,选择一个x的系数不为0的方程,用这个方程消去其他方程的未知数x的系数。每个未知数都做一次,最后就剩下n个只有一个未知数的方程(ax=b)。
#include<bits/stdc++.h> using namespace std; int n,flag; double a[105][105],tmp; int main() { cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=n+1;j++) cin>>a[i][j]; for(int i=1;i<=n;i++) { flag=0; for(int j=i;j<=n;j++) if(a[i][j]) { flag=1; swap(a[i],a[j]); break; } if(!flag)///无解(有无数组解) { cout<<"No Solution"; return 0; } for(int j=1;j<=n;j++) { if(i==j)continue; tmp=a[j][i]/a[i][i]; for(int k=i;k<=n+1;k++) a[j][k]-=a[i][k]*tmp; } } for(int i=1;i<=n;i++) cout<<fixed<<setprecision(2)<<a[i][n+1]/a[i][i]<<endl; return 0; }
亦或方程的高斯消元
#include<bits/stdc++.h> using namespace std; const int MM=3500; int n,m,b[MM],a[MM][MM],ans,flag; string s; int main() { cin>>n>>m; for(int i=1;i<=m;i++) { b[i]=i; cin>>s; for(int j=1;j<=n;j++) a[i][j]=s[j-1]-'0'; cin>>a[i][n+1]; } b[m+1]=m+1; for(int i=1;i<=n;i++) { flag=m+1; for(int j=i;j<=m;j++) if(a[j][i]&&b[j]<b[flag]) flag=j; if(flag==m+1) { cout<<"Cannot Determine"; return 0; } ans=max(ans,b[flag]); swap(a[i],a[flag]); swap(b[i],b[flag]); for(int j=1;j<=m;j++) { if(j==i||!a[j][i])continue; for(int k=i;k<=n+1;k++) a[j][k]^=a[i][k]; } } cout<<ans<<endl; for(int i=1;i<=n;i++) cout<<(a[i][n+1]?"?y7M#":"Earth")<<endl; return 0; }