啊 搞到这个算法 ,大概已经在一周前了 ,一周前做去年西安邀请赛的题,其中有一题是要用到高斯消元法求系数,然后再用矩阵快速幂求正解 ,队里ZK命自认要学数学的我 两天搞清楚那个题。。然后我就从高斯消元法入手了,大概看了两天吧,也有一定的了解了?(其实说麻烦挺麻烦,说简单也挺简单的。。主要是我天资愚钝,查阅了好多好多相关博客,模板,题解 ,还是不是很懂。。。)

时间大概过了有一周吧,凭借记忆来复述一把,接下来的一切不保证对错。(哈哈哈哈 一想到我对自己这么不负责就想笑。。)

高斯消元法 :主要是解多元一次方程的方法。。那么问题就来了,ACM题首先不是中文题,其次它也不会直接给你一个多元一次方程,然后让你来解。所以,高斯消元的难点一:方程难列。凭借我练的那么3个小水题,都是开关问题,就是触碰一个开关,周围相应对应几个也都会关,然后问你有几次操作可以全灭或全亮或者问你应该按那些个。。这一类开关问题的方程还是比较好列的,值得一提的是 开关问题由于每个开关的选择都只有0和1(开和灭)所以就出现一种专门的高斯消元法模板 那就是:高斯消元法异或版,可以通过异或直接求解(我其实并不是很懂异或的原理,但是反正有板子嘛。。。。)

然后就是两种正常的板子,一种有整数解,一种浮点数解。

(哈?是不是要详细解释一下高斯消元的具体操作过程啊。?emmm网上的总结比我的好的多了。)

(偏偏不信这个邪 就要写个更简单通俗易懂的解释)

(写就写!)

高斯消元法 主要就是解 多元一次方程组;

(这里要用到线性代数的知识,我偏偏不用)

解 多元一次方程组,第一步其实就是要化简每一个方程式,尽量让每个式子里的未知数都减少一点(这里我是不是应该像其他博客一样画个图解释一下 emm我偏不!)

(样例:(随便想的。。。为了方便计算 还是想了个简单的数据 还是化简半天。。。然后又简化数据)

5x+3y+6z=29                                                                                              3z+0x+0y=9

4x+6y+2z=22     ==>   (通过一阵上下加减消元 然后上下左右移动一下)=》  2z+3x+0y=9

2x+3y+4z=20                                                                                              1z+3x+2y=9

轻松解出:x=1,y=2,z=3;然后就看到 其实我已经把式子摆成想让你看到的样子。

当然这是安排好的式子 所以第一个式子里只有一个未知元 第二个式子里有两个未知元 而且未知元的系数均为整数

如果不是整数就有分数,有分数的话出来解就不是整数解 也就要用到 浮点数板子。。。。

所以其实高斯消元具体操作就是上面加粗的地方 通过一系列操作 确定每个式子的不定元有几个 有哪些 能否有解 解是整数解

还是浮点数解 emmm 大概就是这样了~)

接下来就是最开心的帖代码时刻~

只上了kuangbin大神的板子 :

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;const int MAXN=50;int a[MAXN][MAXN];//增广矩阵
int x[MAXN];//解集
bool free_x[MAXN];//标记是否是不确定的变元/*
void Debug(void){int i, j;for (i = 0; i < equ; i++){for (j = 0; j < var + 1; j++){cout << a[i][j] << " ";}cout << endl;}cout << endl;
}
*/inline int gcd(int a,int b){int t;while(b!=0){t=b;b=a%b;a=t;}return a;
}
inline int lcm(int a,int b){return a/gcd(a,b)*b;//先除后乘防溢出
}// 高斯消元法解方程组(Gauss-Jordan elimination).(-2表示有浮点数解,但无整数解,
//-1表示无解,0表示唯一解,大于0表示无穷解,并返回自由变元的个数)
//有equ个方程,var个变元。增广矩阵行数为equ,分别为0到equ-1,列数为var+1,分别为0到var.
int Gauss(int equ,int var){int i,j,k;int max_r;// 当前这列绝对值最大的行.int col;//当前处理的列int ta,tb;int LCM;int temp;int free_x_num;int free_index;for(int i=0;i<=var;i++){x[i]=0;free_x[i]=true;}//转换为阶梯阵.col=0; // 当前处理的列for(k = 0;k < equ && col < var;k++,col++){// 枚举当前处理的行.
// 找到该col列元素绝对值最大的那行与第k行交换.(为了在除法时减小误差)max_r=k;for(i=k+1;i<equ;i++){if(abs(a[i][col])>abs(a[max_r][col])) max_r=i;}if(max_r!=k){// 与第k行交换.for(j=k;j<var+1;j++) swap(a[k][j],a[max_r][j]);}if(a[k][col]==0){// 说明该col列第k行以下全是0了,则处理当前行的下一列.k--;continue;}for(i=k+1;i<equ;i++){// 枚举要删去的行.if(a[i][col]!=0){LCM = lcm(abs(a[i][col]),abs(a[k][col]));ta = LCM/abs(a[i][col]);tb = LCM/abs(a[k][col]);if(a[i][col]*a[k][col]<0)tb=-tb;//异号的情况是相加for(j=col;j<var+1;j++){a[i][j] = a[i][j]*ta-a[k][j]*tb;}}}}//  Debug();// 1. 无解的情况: 化简的增广阵中存在(0, 0, ..., a)这样的行(a != 0).for (i = k; i < equ; i++){ // 对于无穷解来说,如果要判断哪些是自由变元,那么初等行变换中的交换就会影响,则要记录交换.if (a[i][col] != 0) return -1;}// 2. 无穷解的情况: 在var * (var + 1)的增广阵中出现(0, 0, ..., 0)这样的行,即说明没有形成严格的上三角阵.// 且出现的行数即为自由变元的个数.if (k < var){// 首先,自由变元有var - k个,即不确定的变元至少有var - k个.for (i = k - 1; i >= 0; i--){// 第i行一定不会是(0, 0, ..., 0)的情况,因为这样的行是在第k行到第equ行.// 同样,第i行一定不会是(0, 0, ..., a), a != 0的情况,这样的无解的.free_x_num = 0; // 用于判断该行中的不确定的变元的个数,如果超过1个,则无法求解,它们仍然为不确定的变元.for (j = 0; j < var; j++){if (a[i][j] != 0 && free_x[j]) free_x_num++, free_index = j;}if (free_x_num > 1) continue; // 无法求解出确定的变元.// 说明就只有一个不确定的变元free_index,那么可以求解出该变元,且该变元是确定的.temp = a[i][var];for (j = 0; j < var; j++){if (a[i][j] != 0 && j != free_index) temp -= a[i][j] * x[j];}x[free_index] = temp / a[i][free_index]; // 求出该变元.free_x[free_index] = 0; // 该变元是确定的.}return var - k; // 自由变元有var - k个.}// 3. 唯一解的情况: 在var * (var + 1)的增广阵中形成严格的上三角阵.// 计算出Xn-1, Xn-2 ... X0.for (i = var - 1; i >= 0; i--){temp = a[i][var];for (j = i + 1; j < var; j++){if (a[i][j] != 0) temp -= a[i][j] * x[j];}if (temp % a[i][i] != 0) return -2; // 说明有浮点数解,但无整数解.x[i] = temp / a[i][i];}return 0;
}
int main(void){int i, j;int equ,var;while (scanf("%d %d", &equ, &var) != EOF){memset(a, 0, sizeof(a));for (i = 0; i < equ; i++){for (j = 0; j < var + 1; j++){scanf("%d", &a[i][j]);}}
//        Debug();int free_num = Gauss(equ,var);if (free_num == -1) printf("无解!\n");else if (free_num == -2) printf("有浮点数解,无整数解!\n");else if (free_num > 0){printf("无穷多解! 自由变元个数为%d\n", free_num);for (i = 0; i < var; i++){if (free_x[i]) printf("x%d 是不确定的\n", i + 1);else printf("x%d: %d\n", i + 1, x[i]);}}else{for (i = 0; i < var; i++){printf("x%d: %d\n", i + 1, x[i]);}}printf("\n");}return 0;
}

值得注意的是 上面的增广矩阵 就是指多元一次方程组的系数和常数组成的行列式(还是要用到线代的知识。。。)模板里的解释和注释相当详细了。够慢慢研究了~。

高斯消元法小总结和瞎总结相关推荐

  1. 摸鱼的小贤在瞎搞R - R语言内置数据集的使用

    系列文章目录 1-R语言的安装及使用(还没写这个,太简单了不太想写) 2-R语言内置数据集的使用 -- 文章都会尽量详细,话多请见谅(我是话痨 文章目录 系列文章目录 1. 查看包中有哪些数据集 2. ...

  2. 摸鱼的小贤在瞎搞Python - Anaconda的安装

    系列文章目录 1-Anaconda的安装 -- 文章都会尽量详细,话多请见谅(我是话痨 文章目录 系列文章目录 1. Anaconda是什么 2. Anaconda的安装(Windows为例) 3. ...

  3. 批量卸载软件脚本python_Python练习小工具——批量删除同名电子书保留指定格式...

    本帖最后由 似水流年2015 于 2020-9-2 23:41 编辑 小书库清理走起,陆陆续续存了上百G的电子书,很多电子书同一本却有4种格式,epub,mobi,azw3, pdf,多浪费硬盘啊,寻 ...

  4. 瞎了,苹果说这两个Logo过于相似而提起诉讼...

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 据外媒报道,苹果公司近日对应用程序梨形标志开发者提起诉讼 ...

  5. 一步步开发自己的博客 .NET版(5、Lucenne.Net 和 必应站内搜索)

    前言 这次开发的博客主要功能或特点:     第一:可以兼容各终端,特别是手机端.     第二:到时会用到大量html5,炫啊.     第三:导入博客园的精华文章,并做分类.(不要封我)     ...

  6. 文本标点符号在前面怎么改_这三个标点符号,为什么写错的人越来越多?

    标点符号是我们写作中必不可少的重要部分,相同的文字,用不同的符号,会产生不同的意义.关于标点的小故事,小学语文课上,老师讲过很多,小编印象最深刻的是这个: 雨果把<悲惨世界>的手稿寄给编辑 ...

  7. UVALive - 4636 Cubist Artwork——思维

    把正视图用体积为1的小格子先填上一层,如果把这些列重排一下恰好能构成右视图,那么当前的填充方法就是最优的,基于这个思想我们对两个数列从大到小排序后瞎搞就可以了 #include <bits/st ...

  8. 假设检验中原假设和备择假设的选取问题

    原假设和备择假设互换的问题 假设检验原理 如何确立原假设 扩展资料 原假设和备择假设互换的问题 假设检验时,将原假设和备择假设互换,有时候会产生完全相反的结果.例如下面这题,如果令H0 :u>2 ...

  9. 哥:我要嫁给你!(让人巨感动)

    一周前,在加拿大的同学给我电话,顾城和他妹妹,还有他们没有出生的孩子出了车祸,当场死亡: 我的大脑瞬间一片空白,甚至于不敢相信电话那头的老同学是不是在开愚人节的玩笑:然而,这的确是真的,顾城一家在多伦 ...

最新文章

  1. Spring-Boot项目部署到单独tomcat运行
  2. Java并发编程的基础-其他的线程复位
  3. java的iterator接口_java Iterator接口和LIstIterator接口分析_java_脚本之家
  4. 使用阿里云极速型NAS构建高可用的GitLab
  5. Elasticsearch整理笔记(三)
  6. 对话Pauly Comtois:赫斯特商业媒体中的企业DevOps采用
  7. Struts 2 的学习笔记(二) struts的配置流程和strut是2的工作原理
  8. c语言入门经典18个程序,c语言入门经典必背18个程序
  9. 信息安全实验——使用john软件破解Windows密码
  10. Freeradius安装和配置
  11. 2023CS保研经验分享(清深、上交、港科大、南大LAMDA、同济、东南Palm等)
  12. Stored Outline
  13. php编程怎样装数据库,php数据库管理工具phpmyadmin下载、安装、配置
  14. 2021十大付费知识平台 知识付费平台排名
  15. ios WKWebView之视频无法播放
  16. Linux Huge page
  17. matlab制作有值显示的条形统计图
  18. 浪潮信息助力医院智慧医疗建设走得既稳又快
  19. UE4/5 EasyFog插件使用
  20. 一件小事引发的思考--如何学习

热门文章

  1. 算法设计与分析——分支限界法
  2. stm32—霍尔传感器的初步使用
  3. 程序阅读_全面详解LTE_MATLAB建模仿真与实现_自学笔记(2)OFDM_程序阅读
  4. 孙振耀退休感言(二)
  5. 计算机网络工程和网络工程的区别,网络工程专业和计算机网络专业有什么区别?...
  6. Redis持久化(少年一贯快马扬帆,道阻且长不转弯)
  7. 人人都要懂的代码重构
  8. window 10 下配置 cygwin ;并且安装 snaphu --SNAP解缠
  9. 【杂项学习】Open3D的基本使用
  10. 路由器关闭dhcp后再登录路由器