【vijos1052】

2015.03.17 19:05 Tue | 22次阅读 | 旧日oi | 固定链接 | 源码

Description

        贾老二是个品学兼优的好学生,但由于智商问题,算术学得不是很好,尤其是在解方程这个方面。虽然他解决  2x=2  这样的方程游刃有余,但是对于  {x+y=3    x-y=1}  这样的方程组就束手无策了。于是他要你来帮忙。前提是一次方程组且保证在integer的范围内可以处理所有问题。

Input

        第一行一个数字N(1≤N≤100)表示要求的未知数的个数,同时也是所给的方程个数。         第2到N+1行,每行N+1个数。前N个表示第1到N个未知数的系数。第N+1个数表示N个未知数乘以各自系数后的加和。(保证有唯一整数解)

Output

        一行N个数,表示第1到N个未知数的值。

Sample Input

2 1 1 3 1 -1 1

Sample Output

2 1

题解

高斯消元模板

我的程序

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#define eps 1e-3
using namespace std; 
int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
int n;
double equ[105][105];
double ans[105];
void gauss()
{
    int i,j,k;
    for(i=1;i<=n;i++)
    {
        for(j=i;j<=n&&!equ[j][i];j++);
        if(i!=j) for(k=i;k<=n+1;k++) swap(equ[i][k],equ[j][k]);
        for(j=i+1;j<=n;j++)
        {
            for(k=n+1;k>=i;k--)
            equ[j][k]-=equ[i][k]/equ[i][i]*equ[j][i];
        }
    }
    for(i=n;i;i--)
    {
        ans[i]=equ[i][n+1];
        for(j=i+1;j<=n;j++) ans[i]-=equ[i][j]*ans[j];
        ans[i]/=equ[i][i];
    }
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n+1;j++)
    scanf("%lf",&equ[i][j]);
    gauss();
    for(int i=1;i<=n;i++)
    {
        printf("%d",(int)(ans[i]+eps));
        if(i!=n)printf(" ");
    }
    return 0;
}```