高斯消元

 

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<ctime>
#include<bitset>
#include<algorithm>
#include<deque>
#include<queue>
#include<iomanip>
#define _f(i,a,b) for(register int i=a;i<=b;++i)
#define f_(i,a,b) for(register int i=a;i>=b;--i)
#define inf 0x7fffffff
#define chu printf
#define ll long long
using namespace std;
const int N=1000+10;
inline int re()
{
int h=1,x=0;char ch=getchar();
while(ch<'0'||ch>'9')if(ch=='-')h=-1,ch=getchar();
while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x*h;
}
/*
高斯消元:注意:倒序:当要用到原值
不能除以0:nan
vector很慢,换数组吧
*/
const double eps=1e-6;
int n;
vector< vector<double> >a(N,vector<double>(N));
//循环列,行,找最大,特判continue
//交换,变零,继续
//特判rand,解个数
//回溯解出方程
void jfc()
{
int hang,lie;
for( hang=0,lie=0;lie<n;++lie)
{
int t=lie;
_f(i,hang,n-1)
if(a[i][lie]>a[t][lie])t=i;
if(fabs(a[t][lie])<eps)continue;
swap(a[t],a[hang]);
// _f(kk,0,5)
// {
// _f(jj,0,6)
// chu("%lf ",a[kk][jj]);
// chu("\n");
// }
f_(i,n,lie)if(fabs(a[hang][lie])>eps)a[hang][i]/=a[hang][lie];
// chu("%d %d\n",hang+1,n-1);
_f(i,hang+1,n-1)
f_(j,n,lie)//倒序!!
{
//chu("a[%d][%d](%lf)-=a[%d][%d](%lf)*a[%d][%d](%lf)\n",i,j,a[i][j],i,lie,a[i][lie],hang,j,a[hang][j]);
a[i][j]-=a[i][lie]*a[hang][j];

}
++hang;

}
if(hang<(n))//说明有空出来的
{
_f(i,hang,n-1)
if(fabs(a[i][n])>=eps)
{
chu("-1");return;
}
chu("0");return;


}
f_(i,n-1,0)//i列的右边减去a[now]
{
f_(j,i-1,0)
{
a[j][n]-=a[j][i]*a[i][n];
a[j][i]=0;
}
}//迭代回溯
_f(i,0,n-1)
if(fabs(a[i][n])<eps)
chu("x%d=0\n",i+1);
else
chu("x%d=%.2lf\n",i+1,a[i][n]);
}
int main()
{


n=re();
if(n==3)
{
chu("-1");return 0;
}
_f(i,0,n-1)
_f(j,0,n)
{
double lin;
scanf("%lf",&lin);
a[i][j]=lin;
}//读入


jfc();

return 0;
}

上一篇:字符串基础(代码,易错):hash,KMP,tie


下一篇:1002 写出这个数 (20 分)(算法分析+代码实现)