您的位置:首页 > 编程语言 > C语言/C++

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

输入  [复制]



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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言