C++——高斯消元模板——解方程组

解方程组

题目描述

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
#include
#include
#include
#include
#include
#include
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<
#include
#include
#include
#include
#include
#include
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语言,C++)