高斯消元解线性方程组的小东西

#include<algorithm>
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
int n;
bool needDebug;
double m[1005][1005]={0};
double x[1005]={0};

void input()
{
	printf("请输入系数矩阵的阶数(1~1000)\n");
	scanf("%d",&n);
	printf("请按行优先顺序输入增广矩阵(用空格、缩进或回车分割每个数字)\n");
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n+1;j++)
			scanf("%lf",&m[i][j]);
	printf("是否输出中间过程的增广矩阵?是请输入y\n");
	char cc[2];
	scanf("%s",cc);
	if(cc[0]=='y') needDebug=1;
	else needDebug=0;
}

void debug()
{
	if(!needDebug) return;
	printf("**********************\n");
	for(int i=1;i<=n;i++,printf("\n"))
		for(int j=1;j<=n+1;j++)
			printf("%24.20lf",m[i][j]);
	printf("**********************\n");
}

inline void rowSwap(int i,int j)
{
	for(int k=1;k<=n+1;k++) std::swap(m[i][k],m[j][k]);
}

int select(int i)
{
	int mxrow=i;
	for(int k=i+1;k<=n;k++)
	{
		if(m[k][i]>m[i][i])
			mxrow=k;
	}
	rowSwap(i,mxrow);
	if(fabs(m[i][i])<1e-10)
	{
		printf("无唯一解\n");
		return 0;
	}
	return 1;
}

int inline gauss()
{
	for(int i=1;i<=n;i++)
	{
		if(!select(i)) return 0;
		for(int j=i+1;j<=n;j++)
		{
			if(fabs(m[j][i])<1e-10) continue;
			double k=m[j][i]/m[i][i];
			for(int h=i;h<=n+1;h++)
			{
				m[j][h]-=m[i][h]*k;
			}
			debug();
		}
	}
	for(int i=n;i;i--)
	{
		x[i]=m[i][n+1]/m[i][i];
		for(int j=i-1;j;j--)
		{
			m[j][n+1]-=x[i]*m[j][i];
			m[j][i]=0;
		}
	}
	return 1;
}

void output()
{
	for(int i=1;i<=n;i++) printf("x_{%d}\t=\t%.2lf\n",i,x[i]);
}

int main()
{
	//freopen("test.in","r",stdin);
	while(1)
	{
		input();
		if(gauss())
			output();
		puts("退出请点击右上角X");
	}
	return 0;
}

posted @ 2019-11-29 11:18  wawcac  阅读(170)  评论(0编辑  收藏  举报