C++——高斯消元模板——解方程组
2017-01-22 11:27
309 查看
解方程组
题目描述
Tom 是个品学兼优的好学生,但由于智商问题,算术学得不是很好,尤其是在解方程这个方面。虽然他解决 2x=2 这样的方程游刃有余,但是对于下面这样的方程组就束手无策了。x+y=3
x-y=1
于是他要你来帮忙。给定一个线性多元一次方程组,请你求出所有未知数的解。
保证在 int 范围内可以处理所有问题。
输入格式
输入文件的第一行一个数字 N(1≤N≤100),表示给定的方程组中的未知数的个数,同时也是这个方程组含有的方程个数。第 2 到 N+1 行,每行 N+1 个数。每行的前 N 个数表示第 1 到 N 个未知数的系数。第 N+1 个数表示 N 个未知数乘以各自系数后再相加的和。
输出格式
输出一行,有 N 个整数,表示第 1 到 N 个未知数的值(整数解),而且数据保证有整数解。
样例数据 1
输入 [复制]2
1 1 3
1 -1 1
输出
2 1
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #include<string> #include<cmath> using namespace std; int n,l,p; double mem[1001][1001]; double tmp; int main() { ios::sync_with_stdio(false); cin.tie(NULL); cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=n+1;j++) cin>>mem[i][j]; int i,j,k; i=1; j=0; p=0; 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; } } for(int i=1;i<=n-1;i++) cout<<floor(mem[i][n+1]+0.5)<<" "; cout<<floor(mem [n+1]+0.5); 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[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][i]*ans[i]; } for(int i=1;i<=n;i++) printf("%d ",(int)(ans[i]+0.5)); return 0; }