您的位置:首页 > 其它

HihoCoder.1195 高斯消元·一 (高斯消元 浮点类型)

2017-08-16 12:48 267 查看

HihoCoder.1195 高斯消元·一 (高斯消元 浮点类型)

标签(空格分隔): 高斯消元

题意分析

还是裸题,但是就是过不了。

一开始是用的int类型的,死活过不去,然后讨论得知需要用double类型的,网上都是一些什么野鸡板子,怎么也过不去。

这些模板类的还是要自己手写一遍,才知道怎么回事。

代码总览

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int N = 1010;
const double EPS=1e-7;
int m,n;
double a

,x
;

void print(){
for (int i=0;i<m;i++){
for (int j=0;j<=n;j++)
printf("%d ",a[i][j]);
puts("");
}
puts("");
}

int Gauss(int m,int n){
int col=0, k=0;//col为列号,k为行号
for (;k<m&&col<n;++k,++col){
int r = k;
for (int i=k+1;i<m;++i)
if(fabs(a[i][col])>fabs(a[r][col]))r=i;
if (fabs(a[r][col])<EPS){k--;continue;}//列全为0
if (r!=k)for(int i=col;i<=n;++i)
swap(a[k][i],a[r][i]);
for (int i=k+1;i<m;++i)//消元
if(fabs(a[i][col])>EPS){
double t = a[i][col]/a[k][col];
for (int j=col;j<=n;j++)a[i][j]-=a[k][j]*t;
a[i][col] = 0;
}
}
for(int i=k ;i<m ;++i)//无解
if (fabs(a[i]
)>EPS) return -1;
if (k < n) return n - k;  //自由元个数
for (int i =n-1; i>=0; i--){//回带求解
double temp = a[i]
;
for (int j=i+1; j<n; ++j)
temp -= x[j] * a[i][j];
x[i] = (temp / a[i][i]);
}
return 0;
}

int main(){

4000
//freopen("fuck.in","r",stdin);
for (;~scanf("%d%d",&n,&m);){
for (int i=0;i<m;i++)
for(int j=0;j<=n;j++)scanf("%lf",&a[i][j]);
int k = Gauss(m,n);
if (k<0) puts("No solutions");
else if (k>0) puts("Many solutions");
else for (int i=0;i<n;i++)
printf("%d\n",(int)(x[i]+0.5));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: