Problem D: 解方程组

Problem D: 解方程组

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

HINT

Append Code

本题利用了高斯消元法的基本步骤:行交换,对角线消元(转化为行阶梯型矩阵),回带

ps.其实最后的结果是小数,只不过只保留了四位有效数字```

#include <stdio.h>
int main()
{
    int i,j,k,t,l,m,n;
    double a[51][51],b[51][51];
    scanf("%d",&m);//主循环
    for(i=0; i<m; i++)
    {
        scanf("%d",&n);
        for(j=0; j<n; j++)
        {
            for(k=0; k<n+1; k++)
            {
                scanf("%lf",&a[j][k]);
            }
        }//赋值
        for(j=0;j<n;j++)
        {
            if(a[j][j])
                continue;
            int e=0;
            for(k=0;k<n;k++)
            {
                if(e) break;
                if(a[j][k]&&a[k][j])
                {
                    for(l=0; l<n+1;l++)
                    {
                        int t= a[j][l];
                        a[j][l]=a[k][l];
                        a[k][l]=t;
                    }
                    e = 1;
                }
            }
        }//保证对角线不是0

        for(j=0; j<n-1; j++)
        {

            for(k=0; k<n; k++)
            {
                if(k>j)
                {
                    double x=a[k][j]/a[j][j];
                    for(l=0; l<=n; l++)
                        a[k][l]-=x*a[j][l];
                }
            }
        }//消元
        for(j=n-1; j>=1; j--)
        {
            for(k=n-1; k>=0; k--)
            {
                if(k<j)
                {
                    double y=a[k][j]/a[j][j];
                    for(l=n; l>=0; l--)
                        a[k][l]-=y*a[j][l];
                }
            }
        }//回带
        for(j=0; j<n; j++)
        {
            a[j][n]/=a[j][j];
            a[j][j]/=a[j][j];
        }//赋x的值
        for(j=0; j<n; j++)
            printf("x%d=%.3lf\n",j+1,a[j][n]);
        printf("\n");

    }
}
                                                                                                 
      ps.感谢琪超醤的方法
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值