[vijos1052] 贾老二算算术

    xiaoxiao2021-03-26  14


    题目描述

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


    输入格式

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


    输出格式

    一行N个数,表示第1到N个未知数的值(四舍五入保留整数)。


    样例数据

    样例输入

    2 1 1 3 1 -1 1

    样例输出

    2 1


    题目分析

    高斯消元模板,题目已经给出了增广矩阵,直接套用即可。 高斯消元是什么? 自己看《线性代数》吧,别用成了高斯若尔当消元


    源代码

    #include<algorithm> #include<iostream> #include<iomanip> #include<cstring> #include<cstdlib> #include<vector> #include<cstdio> #include<cmath> #include<queue> using namespace std; inline const int Get_Int() { int num=0,bj=1; char x=getchar(); while(x<'0'||x>'9') { if(x=='-')bj=-1; x=getchar(); } while(x>='0'&&x<='9') { num=num*10+x-'0'; x=getchar(); } return num*bj; } int n; double a[105][105],Ans[105]; void Simplify(int Line) { //对于行化简 int Row=Line; //1.选主元(系数绝对值最大) double Max=abs(a[Row][Line]); for(int i=Line+1; i<=n; i++) if(abs(a[i][Line])>Max) { Max=abs(a[i][Line]); Row=i; } if(Row!=Line) //2.交换行(将主元调到当前行) for(int i=Line; i<=n+1; i++)swap(a[Line][i],a[Row][i]); for(int i=Line+1; i<=n; i++) { //3.化简该行 double Multiple=a[i][Line]/a[Line][Line]; for(int j=Line; j<=n+1; j++)a[i][j]-=a[Line][j]*Multiple; } } void Gauss() { for(int i=1; i<=n; i++)Simplify(i); for(int i=n; i>=1; i--) { //从最后一个方程回代 for(int j=i+1; j<=n; j++)a[i][n+1]-=a[i][j]*Ans[j]; Ans[i]=a[i][n+1]/a[i][i]; } } int main() { scanf("%d",&n); for(int i=1; i<=n; i++) //读入增广矩阵[AB] for(int j=1; j<=n+1; j++) scanf("%lf",&a[i][j]); Gauss(); for(int i=1; i<=n; i++)printf("%d ",int(Ans[i]+0.5)); return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-600252.html

    最新回复(0)