Description
给定一个n维的线性方程组,可确保方程组有唯一解,编程求出方程组的解。
例如,有方程组
解得
Input
输入的第一个为整数M,接下来有M个测试数据,即M个方程组。每组测试数据首先输入一个整数n(n<=50),表示该方程组有n个未知数,接下来是一个n阶的系数矩阵。
Output
对于每一组数据,输出n个未知数的解。每两组测试数据之间输出一个空行。
请注意未知数的下标和输出顺序与输入的对应关系。
Sample Input
2
4
11 1 5 -4 13
-2 8 2 3 11
3 -2 10 4 15
1 3 -2 17 19
3
2 1 1 28
5 2 2 66
10 5 4 137
Sample Output
x1=1.000
x2=1.000
x3=1.000
x4=1.000
x1=10.000
x2=5.000
x3=3.000
#include<stdio.h>
#include<math.h>
int main()
{
int m;
scanf("%d",&m);
while(m--)
{
int n;
scanf("%d",&n);
double matrix[n+1][n+1];
double b[n+1];
int i,j;
// printf("读入矩阵\n");
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
scanf("%lf",&matrix[i][j]);
scanf("%lf",&b[i]);
}
// printf("打印初始矩阵\n");
// for(i=1; i<=n; i++)
// {
// for(j=1; j<=n; j++)
// printf("%lf ",matrix[i][j]);
// printf("%lf ",b[i]);
// printf("\n");
// }
// printf("将主元位置换为非零元素并打印改变后的矩阵\n");
for(j=1; j<=n; j++)
{
if(fabs(matrix[j][j])<0.000001)
{
int i;
for(i=j+1; i<=n; i++)
{
if(fabs(matrix[i][j])>0.000001)
{
int k;
for(k=1; k<=n; k++)
{
double temp;
temp = matrix[j][k];
matrix[j][k] = matrix[i][k];
matrix[i][k] = temp;
}
double temp2;
temp2 = b[j];
b[j] = b[i];
b[i] = temp2;
}
}
}
}
// for(j=1; j<=n; j++)
// {
// for(i=1; i<=n; i++)
// {
// printf("%lf ",matrix[j][i]);
// }
// printf("%lf",b[j]);
// printf("\n");
// }
// printf("化为上三角矩阵并打印\n");
//化为上三角矩阵
for(j=1; j<=n; j++)
{
int i;
for(i=j+1; i<=n; i++)
{
double t;
t = matrix[i][j]/matrix[j][j];
b[i] = b[i] - b[j]*t;
int k;
for(k=1; k<=n; k++)
{
matrix[i][k] = matrix[i][k] - matrix[j][k]*t;
}
}
}
// for(j=1; j<=n; j++)
// {
// for(i=1; i<=n; i++)
// {
// printf("%lf ",matrix[j][i]);
// }
// printf("%lf",b[j]);
// printf("\n");
// }
// printf("将matrix化为单位矩阵并打印矩阵b\n");
b[n] = b[n]/matrix[n][n];
for(j=n; j>1; j--)
{
int i;
for(i=j-1; i>=1; i--)
{
b[i] = b[i] - b[j]*matrix[i][j];
}
b[j-1] = b[j-1]/matrix[j-1][j-1];
}
for(j=1; j<=n ;j++)
printf("x%d=%.3lf\n",j,b[j]);
printf("\n");
}
return 0;
}