推荐使用代码3
高斯消元
#include<bits/stdc++.h>
using namespace std;
const int maxn=110;
const double eps=1e-6;
int n;
double a[maxn][maxn];
int gauss()
{
for (int i=1;i<=n;i++)
{
int r=i;
for (int j=i;j<=n;j++)
{
if (fabs(a[j][i])>eps)
{
r=j;
break;
}
}
if (r!=i) swap(a[r],a[i]);
if (fabs(a[i][i])<eps) return 0;
for (int j=n+1;j>=i;j--) a[i][j]/=a[i][i];
for (int j=i+1;j<=n;j++)
{
for (int k=n+1;k>=i;k--)
{
a[j][k]-=a[j][i]*a[i][k];
}
}
}
for (int i=n-1;i>=1;i--)
{
for (int j=i+1;j<=n;j++)
{
a[i][n+1]-=a[i][j]*a[j][n+1];
}
}
return 1;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n+1;j++) cin >> a[i][j];
}
if (gauss())
{
for (int i=1;i<=n;i++)
{
cout << fixed << setprecision(2) << a[i][n+1] << endl;
}
}
else cout << "No Solution" << endl;
return 0;
}
高斯_约旦(Jordan不是乔丹吗)
#include<bits/stdc++.h>
using namespace std;
const int maxn=110;
const double eps=1e-6;
int n;
double a[maxn][maxn];
int gauss_jordan()
{
for (int i=1;i<=n;i++)
{
int r=i;
for (int j=i;j<=n;j++)
{
if (fabs(a[j][i])>eps)
{
r=j;
break;
}
}
if (r!=i) swap(a[r],a[i]);
if (fabs(a[i][i])<eps) return 0;
for (int j=1;j<=n;j++)
{
if (j == i) continue;
double t=a[j][i]/a[i][i];
for (int k=i;k<=n+1;k++) a[j][k]-=t*a[i][k];
}
}
for (int i=1;i<=n;i++) a[i][n+1]/=a[i][i];
return 1;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n+1;j++) cin >> a[i][j];
}
if (gauss_jordan())
{
for (int i=1;i<=n;i++)
{
cout << fixed << setprecision(2) << a[i][n+1] << endl;
}
}
else cout << "No Solution" << endl;
return 0;
}
带判无穷解的高斯消元
#include<bits/stdc++.h>
using namespace std;
const int maxn=110;
const double eps=1e-6;
int n;
double a[maxn][maxn];
int gauss()
{
int l=1;
for (int i=1;i<=n;i++)
{
int r=l;
for (int j=l;j<=n;j++)
{
if (fabs(a[j][i])>fabs(a[r][i])) r=j;
}
if (fabs(a[r][i])<eps) continue;
swap(a[r],a[l]);
for (int j=n+1;j>=i;j--)
{
if (fabs(a[l][j])>eps) a[l][j]/=a[l][i];
}
for (int j=1;j<=n;j++)
{
if (j == l) continue;
for (int k=n+1;k>=i;k--)
{
a[j][k]-=a[l][k]*a[j][i];
}
}
l++;
}
for (int i=l;i<=n;i++)
{
if (fabs(a[i][n+1])>eps) return 0;
}
if (l<=n) return -1;
for (int i=n;i>=1;i--)
{
for (int j=i+1;j<=n;j++)
{
a[i][n+1]-=a[i][j]*a[j][n+1];
}
}
return 1;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n+1;j++) cin >> a[i][j];
}
int ans=gauss();
if (ans == 1)
{
for (int i=1;i<=n;i++)
{
cout << "x" << i << "=";
cout << fixed << setprecision(2) << a[i][n+1] << endl;
}
}
else if (ans == 0) cout << "-1" << endl;
else cout << 0 << endl;
return 0;
}
xor的高斯消元
#include <algorithm>
#include <bitset>
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <ctype.h>
#include <errno.h>
#include <float.h>
#include <limits.h>
#include <locale.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <wchar.h>
#include <wctype.h>
#include <limits>
#include <list>
#include <map>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <utility>
#include <vector>
#include <cwchar>
#include <cwctype>
using namespace std;
const int maxn=40;
const double eps=1e-6;
int n,q;
int a[maxn][maxn];
int s[maxn],e[maxn];
int gauss_xor()
{
int l=1;
for (int i=1;i<=n;i++)
{
int r=l;
for (int j=l+1;j<=n;j++)
{
if (a[j][i])
{
r=j;
break;
}
}
if (!a[r][i]) continue;
if (l!=r) swap(a[l],a[r]);
for (int j=l+1;j<=n;j++)
{
for (int k=n+1;k>=i;k--)
{
a[j][k]^=a[l][k]&a[j][i];
}
}
l++;
}
if (l<=n)
{
for (int i=l;i<=n;i++)
{
if (a[i][n+1]) return -1;
}
}
return n-l+1;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> q;
while(q--)
{
memset(s,0,sizeof(s));
memset(e,0,sizeof(e));
memset(a,0,sizeof(a));
cin >> n;
for (int i=1;i<=n;i++) cin >> s[i];
for (int i=1;i<=n;i++) cin >> e[i];
for (int i=1;i<=n;i++)
{
a[i][i]=1;
a[i][n+1]=s[i]^e[i];
}
int x,y;
while(cin >> x >> y)
{
if (x == 0 && y == 0) break;
a[y][x]=1;
}
int num=gauss_xor();
if (num == -1) cout << "Oh,it's impossible~!!" << endl;
else cout << (1<<num) << endl;
}
return 0;
}