AcWing.883.高斯消元解线性方程组

2024-02-01 01:04

本文主要是介绍AcWing.883.高斯消元解线性方程组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

输入一个包含 n 个方程 n 个未知数的线性方程组。

方程组中的系数为实数。

求解这个方程组。

下图为一个包含 m 个方程 n 个未知数的线性方程组示例:
在这里插入图片描述
输入格式
第一行包含整数 n n n

接下来 n n n 行,每行包含 n + 1 n+1 n+1 个实数,表示一个方程的 n n n 个系数以及等号右侧的常数。

输出格式
如果给定线性方程组存在唯一解,则输出共 n n n 行,其中第 i i i 行输出第 i i i 个未知数的解,结果保留两位小数。

注意:本题有 SPJ,当输出结果为 0.00 0.00 0.00 时,输出 − 0.00 -0.00 0.00 也会判对。在数学中,一般没有正零或负零的概念,所以严格来说应当输出 0.00 0.00 0.00,但是考虑到本题作为一道模板题,考察点并不在于此,在此处卡住大多同学的代码没有太大意义,故增加 SPJ,对输出 − 0.00 -0.00 0.00 的代码也予以判对。

如果给定线性方程组存在无数解,则输出 Infinite group solutions

如果给定线性方程组无解,则输出 No solution

数据范围
1 ≤ n ≤ 100 1≤n≤100 1n100,所有输入系数以及常数均保留两位小数,绝对值均不超过 100 100 100

输入样例:

1.00 2.00 -1.00 -6.00
2.00 1.00 -3.00 -9.00
-1.00 -1.00 2.00 7.00

输出样例:

-2.00
3.00

通过高斯消元,来使方程变为上三角形式,从而可以解得方程(大学线性代数)
如果消过之后,是完美的上三角形,那么会得到唯一解
如果中间出现 0 = 0 = 0= (非零)的方程,那么无解
如果中间出现 0 = 0 0 = 0 0=0 的方程,那么就有无穷多解

高斯消元的过程:
枚举每一列:
(1)每次枚举找到绝对值最大的一行
(2)将这一行换到最上面
(3)然后将这一行的第一个数变成1
(4)将下面所有行的当前列消成0。之后继续枚举,但是被换到最上面的那一行就不要动了,直至最后。

#include<iostream>
#include<cmath>
using namespace std;
const int N = 110;
const double eps = 1e-8;//浮点数存储有精度问题,小于一个很小的数就相当于等于0了int n;
double a[N][N];	//存系数矩阵int gauss() {int c, r;	//c:列,r:行for (c = 0, r = 0; c < n; c++) {	//枚举每一列int t = r;	//从这一行开始for (int i = r; i < n; i++)	//找到当前这一列绝对值最大的一行if (fabs(a[i][c]) > fabs(a[t][c]))//fabs():浮点绝对值t = i;if (fabs(a[t][c]) < eps)  continue;	//如果行绝对值的最大值都是0,那么直接跳//因为后续的操作就是为了把其化为0,如果已经为0,那么就不需要进行下面的操作了for (int i = c; i <= n; i++)swap(a[t][i], a[r][i]);//把绝对值最大的这行换到最上面//要倒着进行,不然第一个数(第c列)变成1,后面除的数都不对了for (int i = n; i >= c; i--) a[r][i] /= a[r][c];//把这一行的第一个数变成1(整个方程都需要同步除)for (int i = r + 1; i < n; i++) {		//把下面所有行的第一个数消成0if (fabs(a[i][c]) > eps) {			//如果不是0再进行操作for (int j = n; j >= c; j--)a[i][j] -= a[r][j] * a[i][c];//把整个方程减去变成1的那个方程的倍数	}}r++;//可操作的行减少一个}if (r < n) {	//如果处理过的行小于所有的行,则进行进一步判断for (int i = r; i < n; i++) {	//如果没有等于0的行,即(0 = (非零))if (fabs(a[i][n]) > eps)return 2;//就是无解}return 1;	//如果有0 = 0 那么有无穷多解}for (int i = n - 1; i >= 0; i--)		//从下往上,一步步的把下面x的解往上面带for (int j = i + 1; j < n; j++)		//从而求解出所有的x的解a[i][n] -= a[i][j] * a[j][n];	//减的就是上几行的x的解,因为是上三角形状//减完之后等号右面的值就是这一行的x的解return 0;//唯一解
}int main() {ios::sync_with_stdio(false);cin.tie(0);cin >> n;for (int i = 0; i < n; i++) {	//读入for (int j = 0; j < n + 1; j++) {	//因为还有得数,所以到n+1cin >> a[i][j];}}int t = gauss();//用0表示唯一解,1表示无穷解,2表示无解if (t == 0) {for (int i = 0; i < n; i++) printf("%.2lf\n", a[i][n]);//到最后,矩阵最右面的系数已经是各个x的值了}else if (t == 1) puts("Infinite group solutions");else puts("No solution");return 0;
}

这篇关于AcWing.883.高斯消元解线性方程组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/665606

相关文章

HDU 5833 高斯消元

n个数,任选>=1个数相乘,使得乘积是完全平方数。 其实就是开关,控制灯泡。 数 ----第i个质因子p的个数%2  = {1 , 0} == 开关----第i个灯泡 = {开 , 关} 最后使得所有灯泡都是灭着的方案数 = 2^自由变元个数   全部关着的情况     ==   一个数也不选   应省去 import java.io.BufferedReader;

线性代数 第五讲:线性方程组_齐次线性方程组_非齐次线性方程组_公共解同解方程组_详解

线性方程组 文章目录 线性方程组1.齐次线性方程组的求解1.1 核心要义1.2 基础解系与线性无关的解向量的个数1.3 计算使用举例 2. 非齐次线性方程的求解2.1 非齐次线性方程解的判定2.2 非齐次线性方程解的结构2.3 计算使用举例 3.公共解与同解3.1 两个方程组的公共解3.2 同解方程组 4.重难点题型总结4.1 抽象齐次线性方程组的求解4.1 含有系数的非齐次线性方程组的求

通义说【线性代数】线性方程组和线性代数的关系

线性方程组和线性代数之间有非常紧密的关系。事实上,线性方程组是线性代数的一个核心主题,而线性代数提供了解决线性方程组的一系列理论和工具。 线性方程组 线性方程组是由一组线性方程构成的集合,每个方程都表示未知变量的线性组合等于一个常数项。一个典型的线性方程组可以写作: a 11 x 1 + a 12 x 2 + ⋯ + a 1 n x n = b 1 a 21 x 1 + a 22 x 2 +

hiho一下第56周 高斯消元

小Ho:<吧唧><吧唧><吧唧> 小Hi:小Ho,你还吃呢。想好了么? 小Ho:肿抢着呢(正想着呢)...<吞咽>...我记得这个问题上课有提到过,应该是一元一次方程组吧。 我们把每一件商品的价格看作是x[1]..x[n],第i个组合中第j件商品数量记为a[i][j],其价格记作y[i],则可以列出方程式: a[1][1] * x[1] + a[1][2] * x[2] + ... +

poj 1222 EXTENDED LIGHTS OUT (高斯消元解异或方程组 开关问题)

近距离观摩今天北京站的比赛,向志愿者学姐要了一份题目,看了看H题; 因为数据被弱化,瞬间就想到了背包; 就先研究下标准解法——异或方程组; 下面为转载文: 题意:有一个5*6的矩阵,每个位置都表示按钮和灯,1表示亮,0表示灭。每当按下一个位置的按钮,它和它周围灯的状态全部翻转,问在这样的一个方阵中按下哪些按钮可以把整个方阵都变成灭的,这时1表示按了,0表示没按。 以下

poj1681 高斯消元+dfs枚举

wa  N多次后,终于把高斯消元的模板给弄出来了,并且精简了许多。 用dfs枚举变元比二进制枚举变元简单多了。 (也终于明白 变元代表只得解的个数。) 上模板。 #include <iostream>#include <algorithm>using namespace std;int a[400][400];int ans[400],x[400];//ans[]用于记录哪几种

poj1222 枚举 和 高斯消元

接触开关问题,最先的方法是枚举。然后接触到了更加高深的高斯消元。 高斯消元的思想:把一个全部熄灭的矩阵经过一系列开关后得到初始的状态。 具体分析可参照 http://blog.csdn.net/shiren_Bod/article/details/5766907 下面附上的代码付注释: #include <iostream>using namespace std;int map[3

AcWing算法基础课笔记——高斯消元

高斯消元 用来求解方程组 a 11 x 1 + a 12 x 2 + ⋯ + a 1 n x n = b 1 a 21 x 1 + a 22 x 2 + ⋯ + a 2 n x n = b 2 … a n 1 x 1 + a n 2 x 2 + ⋯ + a n n x n = b n a_{11} x_1 + a_{12} x_2 + \dots + a_{1n} x_n = b_1\\ a_

【C++】高斯消元算法

矩阵初等行变换法则 任一行可以与另一行进行加减。任一行可以乘或除以一个非零常数(除其实就是乘一个倒数)。任两行可以交换位置。 线性方程组 形如 a 1 , 1 x 1 + a 1 , 2 x 2 + ⋯ + a 1 , n x n = b 1 a 2 , 1 x 1 + a 2 , 2 x 2 + ⋯ + a 2 , n x n = b n ⋮ a n , 1 x 1 + a n , 2

To xor or not to xor 高斯消元求异或

【题目】 给你n个long long范围内的整数,你可以选取1个或多个数进行异或操作,使得结果最大,求最大的结果。 【题目分析】 真是一道好题,不是真正理解高斯消元是无法做这题的。 题意:给你n个数,可以选择任意个数异或,但是要使得最后的异或值最大。 我们把每个数用二进制表示,要使得最后的异或值最大,就是要让高位尽量为1,高位能不能为1就必须用高斯消元判断了。 1. 根据数的二进制表示,建立