Problem E: 解方程组

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;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值