首页 > 学院 > 开发设计 > 正文

贾老二算算术 高斯消元

2019-11-08 19:46:46
字体:
来源:转载
供稿:网友

Description 贾老二是个品学兼优的好学生,但由于智商问题,算术学得不是很好,尤其是在解方程这个方面。虽然他解决 2x=2 这样的方程游刃有余,但是对于 {x+y=3 x-y=1} 这样的方程组就束手无策了。于是他要你来帮忙。前提是一次方程组且保证在integer的范围内可以处理所有问题。 Input 第一行一个数字N(1≤N≤100)表示要求的未知数的个数,同时也是所给的方程个数。 第2到N+1行,每行N+1个数。前N个表示第1到N个未知数的系数。第N+1个数表示N个未知数乘以各自系数后的加和。(保证有唯一整数解) Output 一行N个数,表示第1到N个未知数的值。 Sample Input 2 1 1 3 1 -1 1 Sample Output 2 1


高斯消元

#include <cstdio>#include <algorithm>#include <cstdio>#include <cmath>#include <cstring>#define MAXN 105using namespace std;int n,m;double a[MAXN][MAXN];const double eps=1e-8;void PRint(){ for(int i=1;i<=n;i++) { for(int j=1;j<=n+1;j++) printf("%lf ",a[i][j]); printf("/n"); } printf("----/n");}bool gaosi(){ int i=1,to;double t;//now为当前处理的行数 for(int i=1;i<=n;i++) //消去并回代Xi { for(to=i;to<=n;to++) if(fabs(a[to][i])>eps) break;//找到Xi系数非0的一行 if(to>n) continue;//Xi系数全为0 if(to!=i)for(int j=1;j<=n+1;j++) swap(a[to][j],a[i][j]);//交换 t=a[i][i]; for(int j=1;j<=n+1;j++) a[i][j]/=t;//将Xi行所有的系数变为1 for(int j=1;j<=n;j++)//j为1到n 回代与消去同时进行 { if(j==i) continue; t=a[j][i];//倍数 for(int k=1;k<=n+1;k++) a[j][k]-=t*a[i][k]; } } //print(); /*for(int i=now;i<=n;i++) if(fabs(a[i][n+1])>eps) return 0;//出现 0=常数 的情况无解 return 1;//有解*/}int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=n+1;j++) scanf("%lf",&a[i][j]); gaosi(); for(int i=1;i<=n;i++) if(i==n) printf("%d/n",int(a[i][n+1]+0.5)); else printf("%d ",int(a[i][n+1]+0.5)); return 0;}
上一篇:数组与指针

下一篇:多态的实现--虚表

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表