欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Problem D: 解方程组

程序员文章站 2022-07-12 14:11:20
...

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.感谢琪超醤的方法