acwing 高斯消元
1.高斯消元解线性方程组
输入一个包含 n 个方程 n 个未知数的线性方程组。
方程组中的系数为实数。
求解这个方程组。
下图为一个包含 m 个方程 n 个未知数的线性方程组示例:
输入格式
第一行包含整数 n。
接下来 n 行,每行包含 n+1 个实数,表示一个方程的 n 个系数以及等号右侧的常数。
输出格式
如果给定线性方程组存在唯一解,则输出共 n 行,其中第 i 行输出第 i 个未知数的解,结果保留两位小数。
如果给定线性方程组存在无数解,则输出 Infinite group solutions
。
如果给定线性方程组无解,则输出 No solution
。
数据范围
1≤n≤100
所有输入系数以及常数均保留两位小数,绝对值均不超过100。
输入样例:
3
1.00 2.00 -1.00 -6.00
2.00 1.00 -3.00 -9.00
-1.00 -1.00 2.00 7.00
输出样例:
1.00
-2.00
3.00
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=110;
const double eps=1e-8;
int n;
double a[N][N];
int gauss1()
{int 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])){t=i;}}if(fabs(a[t][c])<eps) continue;for(int i=c;i<=n;i++){swap(a[t][i],a[r][i]);}for(int i=n;i>=c;i--){a[r][i]/=a[r][c];}for(int i=r+1;i<n;i++){if(fabs(a[i][c])>eps){for(int j=n;i>=c;j--){a[i][j]-=a[i][c]*a[r][j];}}}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]))t = i;if (fabs(a[t][c]) < eps) continue;for (int i = c; i <= n; i ++ ) swap(a[t][i], a[r][i]); // 将绝对值最大的行换到最顶端for (int i = n; i >= c; i -- ) a[r][i] /= a[r][c]; // 将当前行的首位变成1for (int i = r + 1; i < n; i ++ ) // 用当前行将下面所有的列消成0if (fabs(a[i][c]) > eps)for (int j = n; j >= c; j -- )a[i][j] -= a[r][j] * a[i][c];r ++ ;}if(r<n){for(int i=r;i<n;i++){if(fabs(a[i][n]>eps)){return 2;}}return 1;}for(int i=n-1;i>=0;i--){for(int j=i+1;j<n;j++){a[i][n]-=a[i][j]*a[j][n];}}return 0;
}
int gauss() // 高斯消元,答案存于a[i][n]中,0 <= i < n
{int 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]))t = i;if (fabs(a[t][c]) < eps) continue;for (int i = c; i <= n; i ++ ) swap(a[t][i], a[r][i]); // 将绝对值最大的行换到最顶端for (int i = n; i >= c; i -- ) a[r][i] /= a[r][c]; // 将当前行的首位变成1for (int i = r + 1; i < n; i ++ ) // 用当前行将下面所有的列消成0if (fabs(a[i][c]) > eps)for (int j = n; j >= c; j -- )a[i][j] -= a[r][j] * a[i][c];r ++ ;}if (r < n){for (int i = r; i < n; i ++ )if (fabs(a[i][n]) > eps)return 2; // 无解return 1; // 有无穷多组解}for (int i = n - 1; i >= 0; i -- )for (int j = i + 1; j < n; j ++ )a[i][n] -= a[i][j] * a[j][n];return 0; // 有唯一解
}int main()
{scanf("%d", &n);for (int i = 0; i < n; i ++ )for (int j = 0; j < n + 1; j ++ )scanf("%lf", &a[i][j]);int t = gauss1();if (t == 2) puts("No solution");else if (t == 1) puts("Infinite group solutions");else{for (int i = 0; i < n; i ++ ){if (fabs(a[i][n]) < eps) a[i][n] = 0; // 去掉输出 -0.00 的情况printf("%.2lf\n", a[i][n]);}}return 0;
}
2.高斯消元解异或线性方程组
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=110;
int a[N][N];
int n;
int gauss()
{int c,r; //定义行、列for(c=0,r=0;c<n;c++) //遍历所有列{int t=r;for(int i=r;i<n;i++){if(a[i][c]) //找到非零行{t=i; break;}}if(!a[t][c]) continue; //如果找不到非零行,直接下一个循环即可for(int i=c;i<=n;i++) swap(a[r][i],a[t][i]); //将非零行与第一行交换。for(int i=r+1;i<n;i++) //开始将该列下的每一个数消成0;{if(a[i][c]) //如果存在非零行。则进行以下的异或操作来将该行首列异或为0;{for(int j=n;j>=0;j--) //注意要从右往左遍历{a[i][j]^=a[r][j];}}}r++;}if(r<n) //说明不是唯一解{for(int i=r;i<n;i++){if(a[i][n]) //如果存在冲突,说明无解{return 2;}return 1; //说明有无穷多节}}for(int i=n-1;i>=0;i--){for(int j=i+1;j<n;j++){a[i][n]^=a[i][j]&a[j][n];}}return 0;
}
int main()
{ cin>>n;for(int i=0;i<n;i++) //输入方程数组{for(int j=0;j<n+1;j++){cin>>a[i][j];}}int t=gauss(); //定义一个变量存储答案if(t==0){for(int i=0;i<n;i++) cout<<a[i][n]<<endl;}else if(t==2) cout<<"No solution"<<endl;else cout<<"Multiple sets of solutions"<<endl;return 0;
}
acwing 高斯消元相关推荐
- AcWing - 高斯消元解线性方程组(高斯消元)
题目链接:https://www.acwing.com/problem/content/885/ 时/空限制:1s / 64MB 题目描述 输入一个包含n个方程n个未知数的线性方程组. 方程组中的系数 ...
- AcWing 884. 高斯消元解异或线性方程组
题目连接 https://www.acwing.com/problem/content/886/ 思路 和浮点高斯消元类似的,步骤也是相同的,不过我们这里的运算操作变成了异或操作,对于我们枚举到的第r ...
- [AcWing]883. 高斯消元解线性方程组(C++实现)高斯消元解线性方程组模板题
[AcWing]883. 高斯消元解线性方程组(C++实现)高斯消元解线性方程组模板题 1. 题目 2. 读题(需要重点注意的东西) 3. 解法 4. 可能有帮助的前置习题 5. 所用到的数据结构与算 ...
- 高斯消元 AcWing 883. 高斯消元解线性方程组
高斯消元 AcWing 883. 高斯消元解线性方程组 原题链接 AcWing 883. 高斯消元解线性方程组 算法标签 线性代数 高斯消元 思路 代码 #include<bits/stdc++ ...
- AcWing 883. 高斯消元解线性方程组(高斯消元模板)
先出裸的模板: #include<bits/stdc++.h>using namespace std; const int N = 110; typedef double db; db a ...
- AcWing 883. 高斯消元解线性方程组 (高斯消元)
题目链接 : 点击查看 题目描述 : 输入一个包含 n 个方程 n 个未知数的线性方程组. 方程组中的系数为实数. 求解这个方程组. 下图为一个包含 m 个方程 n 个未知数的线性方程组示例: 输入输 ...
- 高斯消元解线性方程组(浮点高斯消元模板)
题目连接 https://www.acwing.com/problem/content/885/ 思路 高斯消元的思路如下: 1.我们从上到下,从左到右开始消元,对于每一行我们只保留当前[i,i]行的 ...
- 高斯消元——解线性方程组+球形空间产生器+开关问题
传送门:https://www.acwing.com/activity/content/11/ 思路: 把原矩阵变成阶梯型矩阵解题步骤: 1.找到绝对值最大的一行. 2.将该行和最上面未处理好的一行交 ...
- 数论 - 高斯消元算法
1.高斯消元 (1)定义 高斯消元法是求解线性方阵组的一种算法,它也可用来求矩阵的秩,以及求可逆方阵的逆矩阵.它通过逐步消除未知数来将原始线性系统转化为另一个更简单的等价的系统.它的实质是通过初等行变 ...
最新文章
- 关于个别网段上网时断时续的问题解决
- 拒做工具人!教你一键快速部署应用到容器镜像仓库
- Sublime Text 3 常用快捷键汇总
- 不到100行写出一个完整的web框架
- 京东抄袭源码;腾讯回应裁员;新 iPad Pro 十月发布 ​| 极客头条
- PHP能得到你是从什么页面过来的,r…
- WinHex V14.6 SR-2 注册码
- 计算机删除其它用户,如何通过注册表删除多余的账号如何删除电脑其它用户
- 舞蹈课(dance.cpp/c/pas)
- 华为事件鸿蒙系统,科技大事件 迎接华为鸿蒙车机系统的到来
- 建行u盾弹不出来_如果建行网银盾无法识别怎么办,不要怕,只需几招就搞定...
- 洛谷 2184 贪婪大陆
- 白度云下载到存储卡的视频看不了_苹果手机从百度网盘下载的视频如何保存到相册,还有不知道的吗?...
- 【华为OD机试 2023最新 】 网上商城优惠活动(C++)
- java计算机毕业设计软考刷题系统源码+mysql数据库+系统+lw文档+部署
- 【Day1】一小时入门 python 基础,从安装到入门
- SAP ABAP性能优化 - 调优工具 SM50 | ST05 | SAT
- Caliburn.Micro 入门
- 程序员最容易吃的亏,就是不会说话!
- asp医药连锁店管理系统
热门文章
- 医嘱卡片打印功能修改
- ROS开发之如何将树莓派采集的雷达、IMU数据在虚拟机rviz中显示?
- 关于Springboot中使用Pagehelper说明
- ATSHA204A加密芯片的使用
- Android测量图像中物体大小,android – 如何使用OpenCV从图像中检测(计数)头发?
- PHP开发环境搭建--Windows
- Android白眉鹰王之BroadcastReceiver
- linux取消注释快捷键设置,Notepad++怎么增加整行删除快捷键?添加/取消区块注释?...
- 快速突破流量瓶颈的方法,需从如下五点数据分析
- 学习编程真的会秃头吗???