高斯消元
2018-04-11 09:31
134 查看
特别注意主元为零与不可逆矩阵情况
一号代码(曾老):
//高斯消元(SOJ- P514 解方程) #include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> using namespace std; int n; double mem[1001][1002]; void Init() //读入数据 { cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=n+1;j++) cin>>mem[i][j]; } void Kernel() { int i,j,k,l,p; double tmp; p=0; i=1; while(i+p<=n) { j=i; while(j<=n && mem[j][i+p]==0) j++; if(j>n) { p++; break; } for(k=j+1;k<=n;k++) //消元 { tmp=mem[k][i+p]/mem[j][i+p]; mem[k][i+p]=0; for(l=i+p+1;l<=n+1;l++) mem[k][l]=mem[k][l]-mem[j][l]*tmp; } ***if(i!=j)//主元为零情况处理 for(k=1;k<=n+1;k++) { tmp=mem[i][k]; mem[i][k]=mem[j][k]; mem[j][k]=tmp;*** } i++; } for(i=n;i>=1;i--) //回代过程 { mem[i][n+1]=mem[i][n+1]/mem[i][i]; mem[i][i]=1; for(j=i-1;j>=1;j--) { tmp=mem[j][i]/mem[i][i]; mem[j][n+1]=mem[j][n+1]-mem[i][n+1]*tmp; mem[j][i]=0; } } } void Print() //输出 { for(int i=1;i<=n-1;i++) cout<<floor(mem[i][n+1]+0.5)<<" "; //四舍五入输出 cout<<floor(mem [n+1]+0.5); } int main() { freopen("gs.in","r",stdin); //freopen("gs.out","w",stdout); Init(); Kernel(); Print(); return 0; }
二号代码(刘书含):
#include<iostream> #include<cstring> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; double a[102][102];//必须用double否则误差非常大 double ans[102]; int n; int main() { //freopen("gs.in","r",stdin); //freopen("gs.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=n+1;j++) scanf("%lf",&a[i][j]); for(int j=1;j<=n;j++) { if(a[j][j]==0)//处理前导零情况 { for(int i=j+1;i<=n;i++) { if(a[i][j]!=0) { for(int k=j;k<=n+1;k++)//主元为零,与下行不为零交换 swap(a[i][k],a[j][k]); break; } } } for(int i=j+1;i<=n;i++)//消元 { double x=a[i][j]/a[j][j]; for(int k=j;k<=n+1;k++) a[i][k]=a[i][k]-a[j][k]*x; } } //回代 for(int i=n;i>=1;i--) { ans[i]=a[i][n+1]/a[i][i]; for(int k=1;k<=i-1;k++) a[k][n+1]=a[k][n+1]-a[k][i]*ans[i];//消元 } for(int i=1;i<=n;i++) printf("%d ",(int)(ans[i]+0.5));//四舍五入取整 return 0; }
三号代码(樊思劼):此代码只能解唯一解情况,消元矩阵
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<ctime> #include<cmath> #include<algorithm> #include<cctype> #include<iomanip> using namespace std; double matrix[120][120],eps=0.0000001; int n,m; void gauss() { for(int i=1;i<=n;i++) { int maxl;double temp; maxl=i; for(int j=i+1;j<=m;j++)//先把最大的数移到最上面,以免在消元时出现主元为零情况 if(fabs(matrix[maxl][i])<fabs(matrix[j][i])) maxl=j; if(maxl!=i) for(int j=i;j<=m;j++) swap(matrix[maxl][j],matrix[i][j]); temp=matrix[i][i];//消元+回代 for(int j=i+1;j<=m;j++) matrix[i][j]=matrix[i][j]/temp; for(int j=1;j<=n;j++) if(j!=i) { temp=matrix[j][i]; for(int k=i;k<=m;k++) matrix[j][k]=matrix[j][k]-matrix[i][k]*temp; } } return ; } int main() { //freopen("gs.in","r",stdin); scanf("%d",&n); m=n+1;//列 for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%lf",&matrix[i][j]); gauss(); for(int i=1;i<=n;i++) { if(matrix[i][m]<eps) printf("0 "); else printf("%.0lf ",matrix[i][m]); } return 0; }
相关文章推荐
- poj -- 3185 The Water Bowls(高斯消元)
- poj1830(高斯消元)
- hdu4870 Rating (高斯消元或者dp)
- [高斯消元] poj 1753 Flip Game
- POJ 1753 Flip Game(枚举变元的高斯消元)
- 学习笔记----高斯消元(一)
- POJ 1166 The Clocks 高斯消元 + exgcd(纯属瞎搞)
- uva 1560 - Extended Lights Out(枚举 | 高斯消元)
- 高斯消元模板(转)
- BZOJ 2728 HNOI2012 与非 高斯消元
- POJ 1830 开关问题 高斯消元
- POJ 1222 EXTENDED LIGHTS OUT 高斯消元解异或方程组
- poj 2065 SETI(数学:高斯消元)
- [数论] 高斯消元(整型和浮点型)
- 【高斯消元】【poj 1830】开关问题
- HDU 4326 Game 概率DP 高斯消元
- hdu-4818-RP problem(高斯消元)
- SGU 275 To xor or not to xor (高斯消元)
- 【BZOJ3503】【Cqoi2014】和谐矩阵 高斯消元,解异或方程组
- 【高斯消元】【异或方程组】poj1222 EXTENDED LIGHTS OUT