版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lv414333532/article/details/82823040
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
double A[1010][1010];
double B[1010];
double l;
int main()
{
int n;
printf("请输入矩阵的阶数,如想要退出请按零:\n");
while(~scanf("%d",&n))
{
if(n==0)
return 0;
printf("请按从上到下输入矩阵:\n");
for(int i=1; i<=n; i++) //记录原始矩阵A;
{
for(int j=1; j<=n; j++)
{
scanf("%lf",&A[i][j]);
}
}
/* 由 i行 2 3 1
j行 2 5 6
变为 i行 2 3 1
j行 0 2 5
这一过程称为 去除第j行i因子;其中消零因子为:2/2=1*/
(本人自己定义)
for(int i=1; i<=n; i++) //记录B;
{
scanf("%lf",&B[i]);
}
for(int i=1; i<n; i++) //高斯消元;从第一行到n-1行;
{
for(int j=i+1; j<=n; j++)//当前消得是第j行;
{
l=A[j][i]/A[i][i]; //计算消零因子;
for(int k=i; k<=n; k++)//消除第j行每一个数的i因子;
{
A[j][k]-=l*A[i][k];
}
B[j]-=l*B[i]; //对应的B也消去j行i因子
}
}
for(int i=n; i>=1; i--) //回代求X;
{
for(int j=n; j>i; j--)
{
B[i]-=A[i][j]*B[j];
}
B[i]/=A[i][i];
}
for(int i=1; i<=n; i++) //输出X;
{
printf("%f\n",B[i]);
}
printf("请输入矩阵的阶数,如想要退出请按零:\n");
}
return 0;
}