【模板】高斯消元(仅代码纯享版)

#include<cmath>
#include<cstdio>
#include<algorithm>

using namespace std;

const int MAXN = 110;
const double EPS = 1e-7;
int n, r, len;
double a[MAXN][MAXN];

int main(){
    scanf("%d", &n);
    for(register int i = 0; i < n; i++)
        for(register int j = 0; j <= n; j++)
            scanf("%lf", &a[i][j]);

    for(register int i = 0; i < n; i++){
        r = len;
        for(register int j= i + 1; j < n; j++)
            if(fabs(a[j][i]) > fabs(a[r][i]))
                r = j;

        if(r != len)
            for(register int j = 0; j <= n; j++)
                swap(a[r][j], a[i][j]);

        if(fabs(a[len][i]) < EPS)
            continue;

        for(register int j = len + 1; j < n; j++){
            double f = a[j][i] / a[len][i];
            for(register int k = i; k <= n; k++)
                a[j][k] -= a[len][k] * f;
        }

        len++;
    }

    for(register int i = n - 1; i >= 0; i--){
        for(register int j = i + 1; j < n; j++)
            a[i][n] -= a[i][j] * a[j][n];
        a[i][n] /= a[i][i];
    }

    for(register int i = 0; i < n; i++)
        printf("x%d=%.2lf\n", i + 1, a[i][n]);

    return 0;
}

P3389 【模板】高斯消元法

#include<cmath>
#include<cstdio>
#include<algorithm>

using namespace std;

const int MAXN = 110;
const double EPS = 1e-7;
int n, r, len;
double a[MAXN][MAXN];

int main(){
	scanf("%d", &n);
	for(register int i = 0; i < n; i++)
		for(register int j = 0; j <= n; j++)
			scanf("%lf", &a[i][j]);
	
	for(register int i = 0; i < n; i++){
		r = len;
		for(register int j = i + 1; j < n; j++)
			if(fabs(a[j][i]) > fabs(a[r][i]))
				r = j;
				
		if(r != len)
			for(register int j = 0; j <= n; j++)
				swap(a[r][j], a[i][j]);
		
		if(fabs(a[len][i]) < EPS){
			puts("No Solution");
			return 0;
		}
				
		for(register int j = len + 1; j < n; j++){
			double f = a[j][i] / a[len][i];
			for(register int k = i; k <= n; k++)
				a[j][k] -= a[len][k] * f;
		}
		
		len++;
	}
	
	for(register int i = n - 1; i >= 0; i--){
		for(register int j = i + 1; j < n; j++)
			a[i][n] -= a[i][j] * a[j][n];
		a[i][n] /= a[i][i];
	}
	
	for(register int i = 0; i < n; i++)
		printf("%.2lf\n", a[i][n]);
		
	return 0;
}

P2455 [SDOI2006]线性方程组

#include<cmath>
#include<cstdio>
#include<algorithm>

using namespace std;

const int MAXN = 110;
const double EPS = 1e-7;
int n, r, len;
double a[MAXN][MAXN];

int main(){
	scanf("%d", &n);
	for(register int i = 0; i < n; i++)
		for(register int j = 0; j <= n; j++)
			scanf("%lf", &a[i][j]);
	
	for(register int i = 0; i < n; i++){
		r = len;
		for(register int j = i + 1; j < n; j++)
			if(fabs(a[j][i]) > fabs(a[r][i]))
				r = j;
				
		if(r != len)
			for(register int j = 0; j <= n; j++)
				swap(a[r][j], a[i][j]);
		
		if(fabs(a[len][i]) < EPS)
			continue;
				
		for(register int j = len + 1; j < n; j++){
			double f = a[j][i] / a[len][i];
			for(register int k = i; k <= n; k++)
				a[j][k] -= a[len][k] * f;
		}
		
		len++;
	}
	
	if(len < n){
		for(register int i = len; i < n; i++)
			if(fabs(a[i][n]) > EPS && fabs(a[i][i]) < EPS){
				puts("-1");
				return 0;
			}
		puts("0");
		return 0;
	}
	
	for(register int i = n - 1; i >= 0; i--){
		for(register int j = i + 1; j < n; j++)
			a[i][n] -= a[i][j] * a[j][n];
		a[i][n] /= a[i][i];
	}
	
	for(register int i = 0; i < n; i++){
		if(a[i][n] == -0) a[i][n] = 0;
		printf("x%d=%.2lf\n", i+1, a[i][n]);
	}	
	
	return 0;
}

P4035 [JSOI2008]球形空间产生器

#include<cmath>
#include<cstdio>
#include<algorithm>

using namespace std;

const int MAXN = 15;
const double EPS = 1e-7;
int n;
double a[MAXN][MAXN], num[MAXN][MAXN];

void Gauss(){
	int r, len = 0;
	
	for(register int i = 0; i < n; i++){
		r = len;
		for(register int j = i + 1; j < n; j++)
			if(fabs(a[j][i]) > fabs(a[r][i]))
				r = j;
				
		if(r != len)
			for(register int j = 0; j <= n; j++)
				swap(a[r][j], a[i][j]);
		
		if(fabs(a[len][i]) < EPS)
			continue;
				
		for(register int j = len + 1; j < n; j++){
			double f = a[j][i] / a[len][i];
			for(register int k = i; k <= n; k++)
				a[j][k] -= a[len][k] * f;
		}
		
		len++;
	}
	
	for(register int i = n - 1; i >= 0; i--){
		for(register int j = i + 1; j < n; j++)
			a[i][n] -= a[i][j] * a[j][n];
		a[i][n] /= a[i][i];
	}
}

int main(){
	scanf("%d", &n);
	for(register int i = 0; i <= n; i++)
		for(register int j = 0; j < n; j++)
			scanf("%lf", &num[i][j]);
	
	for(register int i = 0; i < n; i++)
		for(register int j = 0; j < n; j++){
			a[i][j] = 2.0 * (num[i][j] - num[i+1][j]);
			a[i][n] += num[i][j] * num[i][j] - num[i+1][j] * num[i+1][j];
		}
	Gauss();
	
	for(register int i = 0; i < n; i++)
		printf("%.3lf ", a[i][n]);
		
	return 0;
}
posted @ 2022-08-03 22:02  TSTYFST  阅读(67)  评论(0编辑  收藏  举报