浙江农林大学第十九届程序设计竞赛暨天梯赛选拔赛——I 来解方程吧

浙江农林大学第十九届程序设计竞赛暨天梯赛选拔赛——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;
 }
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值