Cod sursa(job #1965242)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 14 aprilie 2017 01:39:53
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#include <cmath>

using namespace std;

const int MaxN=3e2+5;
const double eps=1e-8;
FILE *IN,*OUT;

int N,M;
bool Possible=true;
double Mat[MaxN][MaxN],X[MaxN];

int main()
{
	IN=fopen("gauss.in","r");
	OUT=fopen("gauss.out","w");

	fscanf(IN,"%d%d",&N,&M);
	M++;
	for(int i=1;i<=N;i++)
		for(int j=1;j<=M;j++)
			fscanf(IN,"%lf",&Mat[i][j]);
	int row=1,col=1;
	while(row<=N&&col<M)
	{
		int one;
		for(int i=row;i<=N;i++)
			if(abs(Mat[i][col])>eps)
			{
				one=i;
				break;
			}
		if(one==M)
		{
			col++;
			continue;
		}
		if(one!=row)
			for(int i=1;i<=M;i++)
				swap(Mat[one][i],Mat[row][i]);

		for(int i=col+1;i<=M;i++)
			Mat[row][i]/=Mat[row][col];
		Mat[row][col]=1;

		for(int i=row+1;i<=N;i++)
		{
			for(int j=col+1;j<=M;j++)
				Mat[i][j]-=Mat[row][j]*Mat[i][col];
			Mat[i][col]=0;
		}
		row++,col++;
	}
	for(int i=N;i>0&&Possible;i--)
		for(int j=1;j<=M;j++)
			if(abs(Mat[i][j])>eps)
			{
				if(j==M)
				{
					Possible=false;
					break;
				}
				else
				{
					X[j]=Mat[i][M];
					for(int k=j+1;k<M;k++)
						X[j]-=X[k]*Mat[i][k];
					break;
				}
			}
	if(Possible)
	{
		for(int i=1;i<M;i++)
			fprintf(OUT,"%.8lf ",X[i]);
	}
	else fprintf(OUT,"Imposibil\n");
	return 0;
}