高斯消元

推荐使用代码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;
}
posted @ 2026-04-07 11:47  msjing  阅读(13)  评论(0)    收藏  举报