高斯消元
高斯消元+多元二次式转多元一次式
:注意:fabs()
不能除以0
倒序
#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=100;
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;
}
/*
n*n矩阵a
先来一个 base[][],
for(i:1-n)
for(J:1-n)
a[i][j]=base[i][j]-base[i+1][j]
然后平方base
for(i:1-n)
for(j:)
a[i][n]=base[i][j]-base[i+1][j] (n个)
预处理完了
用a[][]高斯消元就行
*/
const double eps=1e-5;
int n; double a[N][N],base[N][N];
//循环行列找最大,特判continue
//自己除变1
//下面的乘单位1个
//回溯解出方程 (0特判,倒序)
//不用特判解,有位唯一
void jfc()
{
int hang,lie;
for(hang=1,lie=1;lie<=n;lie++)
{
int t=hang;
for(int i=hang;i<=n;i++)
if(fabs(a[i][lie])>fabs(a[t][lie]))t=i;//!!!!这里要用绝对值
//因为有负数的话如果比0小那后面判断就直接掠过这一列了
if(fabs(a[t][lie])<eps)continue;
for(int i=lie;i<=n+1;i++)swap(a[t][i],a[hang][i]);
f_(i,n+1,lie)a[hang][i]/=a[hang][lie];
_f(i,hang+1,n)
if(fabs(a[i][lie])>eps)
f_(j,n+1,lie)
a[i][j]-=a[hang][j]*a[i][lie];
++hang;
}
f_(i,n,1)
{
f_(j,i-1,1)
{
a[j][n+1]-=a[j][i]*a[i][n+1];
a[j][i]=0;
}
} //解完了??
}
int main()
{
//freopen("exam.txt","r",stdin);
//chu("jj\n");
scanf("%d",&n);
// chu("kk\n");
_f(i,1,n+1)
_f(j,1,n)
scanf("%lf",&base[i][j]);
_f(i,1,n)
{
double sum=0;
_f(j,1,n)
{
a[i][j]=2*(base[i][j]-base[i+1][j]);
sum+=base[i][j]*base[i][j]-base[i+1][j]*base[i+1][j];
}
a[i][n+1]=sum;
}
jfc();
_f(i,1,n-1)
chu("%.3lf ",a[i][n+1]);
chu("%.3lf",a[n][n+1]);
return 0;
}
浙公网安备 33010602011771号