【问题描述】
贾老二是个品学兼优的好学生,但由于智商问题,算术学得不是很好,尤其是在解方程这个方面。虽然他解决 2x=2 这样的方程游刃有余,但是对于 {x+y=3 x-y=1} 这样的方程组就束手无策了。于是他要你来帮忙。前提是一次方程组且保证在integer的范围内可以处理所有问题。
【输入格式】
第一行一个数字N(1≤N≤100)表示要求的未知数的个数,同时也是所给的方程个数。
第2到N+1行,每行N+1个数。前N个表示第1到N个未知数的系数。第N+1个数表示N个未知数乘以各自系数后的加和。(保证有唯一整数解)
第2到N+1行,每行N+1个数。前N个表示第1到N个未知数的系数。第N+1个数表示N个未知数乘以各自系数后的加和。(保证有唯一整数解)
【输出格式】
一行N个数,表示第1到N个未知数的值。
【输入样例】
2
1 1 3
1 –1 1
1 1 3
1 –1 1
【输出样例】
2 1
【数据范围】
1≤N≤100
【来源】
https://vijos.org/p/1052
#include<bits/stdc++.h> using namespace std; int n; double D[105]; double JZ[105][105];//存储矩阵 void XY() { for(int i=0;i<n;i++) { int r=i; for(int k=i+1;k<n;k++) { if(abs(JZ[r][i])<abs(JZ[k][i])) r=k;//寻找第i列元素最大值所在行数 } if(r!=i) for(int j=i;j<=n;j++) swap(JZ[r][j],JZ[i][j]);//交换位置 double a=JZ[i][i]; if(a) { for(int j=i+1;j<n;j++) { double b=JZ[j][i]; for(int k=i;k<=n;k++) JZ[j][k]-=JZ[i][k]*b/a; } } } } void Q()//求解 { D[n-1]=JZ[n-1][n]/JZ[n-1][n-1]; for(int i=n-2;i>=0;i--) { for(int j=i+1;j<n;j++) JZ[i][n]-=D[j]*JZ[i][j]; D[i]=JZ[i][n]/JZ[i][i]; } for(int i=0;i<n;i++) { int g=D[i]+0.5;//注意这里要+0.5才能保证正确 cout<<g<<" "; } } int main() { cin>>n; for(int i=0;i<n;i++) { for(int j=0;j<=n;j++) { cin>>JZ[i][j]; } } XY(); for(int i=0;i<n;i++) { for(int j=0;j<=n;j++) { cout<<JZ[i][j]<<" "; } cout<<endl; } Q(); }