浙江农林大学第十九届程序设计竞赛暨天梯赛选拔赛——I 来解方程吧
链接:https://ac.nowcoder.com/acm/contest/7872/I
来源:牛客网
题目描述
想必大家对于解方程一定不陌生,但是如果方程的变量有很多,
这个时候再去依靠人脑计算就显得非常的不切实际了。所以我们
希望你可以设计一个程序来帮助我们计算方程式的解。
输入描述:
N (表示方程式的变量数)
接下里输入一个 N * (N + 1)的矩阵 A
表示对于每一行来说
A[i][1] * X[1] + A[i][2] * X[2] … + A[i][N] * X[N] = A[i][N+1]
这个等式恒成立
输出描述:
1 <= N <= 1000, N 为整数
0 <= A[i][j] <= 10000, A[i][j] 为实数
输出:
一行,共 N 个实数表示方程的解,保留两位小数,相邻两位用空格
隔开。
特别的,如果方程有多解,请输出“Multiple Solution”
如果方程无解,请输出“No Solution”
示例1
输入
复制
2
1.00 1.00 3.00
1.00 0.00 2.00
输出
复制
2.00 1.00
***思路:***高斯消元模板题。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=10007;
#define eps 1e-6
double a[maxn][maxn];
double ans[maxn];
bool Free[maxn];
int GCD ( int a, int b ) {
if ( ! b )
return a;
return GCD ( b, a % b );
}
int LCM ( int a, int b ) {
return a / GCD ( a, b ) * b;
}
int Gauss ( int equ, int var ) {
for ( int i = 0;i <= var;i ++ ) {
ans[i] = 0;
Free[i] = 1;
}
int row, col, MaxRow;
col = 0;
for ( row = 0;row < equ && col < var;row ++, col ++ ) {
MaxRow = row;
for ( int i = row + 1;i < equ;i ++ )
if ( fabs ( a[i][col] ) > fabs ( a[MaxRow][col] ) )
MaxRow = i;
if ( MaxRow != row ) {
for ( int i = row;i <= var;i ++ )
swap ( a[row][i], a[MaxRow][i] );
}
if ( fabs ( a[row][col] ) < eps ) {
row --;
continue;
}
for ( int i = row + 1;i < equ;i ++ ) {
if ( fabs ( a[i][col] ) > eps ) {
double temp = a[i][col] / a[row][col];
for ( int j = col;j <= var;j ++ )
a[i][j] -= a[row][j] * temp;
a[i][col] = 0;
}
}
}
for ( int i = row;i < equ;i ++ )
if ( fabs ( a[i][col] ) > eps )
return -1;
double temp;
if ( row < var ) {
for ( int i = row - 1;i >= 0;i -- ) {
int free_num = 0, idx;
for ( int j = 0;j < var;j ++ )
if ( a[i][j] && Free[j] ) {
free_num ++;
idx = j;
}
if ( free_num > 1 )
continue;
temp = a[i][var];
for ( int j = 0;j < var;j ++ ) {
if ( a[i][j] && j != idx )
temp -= a[i][j] * ans[j];
}
ans[idx] = temp / a[i][idx];
Free[idx] = 0;
}
return 1;
}
for ( int i = var - 1;i >= 0;i -- ) {
temp = a[i][var];
for ( int j = i + 1;j < var;j ++ )
if ( a[i][j] )
temp -= a[i][j] * ans[j];
ans[i] = temp / a[i][i];
}
return 0;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
for(int j=0;j<n+1;j++)
{
scanf("%lf",&a[i][j]);
}
}
int flag=Gauss(n,n);
if(flag==1)
{
printf("Multiple Solution\n");
}else if(flag==-1)
{
printf("No Solution\n");
}else if(flag==0)
{
for(int i=0;i<n;i++)
{
if(i==0)printf("%.2f",ans[i]);
else printf(" %.2f",ans[i]);
}
printf("\n");
}
return 0;
}