2 条题解

  • 0
    @ 2025-10-8 16:51:30

    G23线性方程组高斯消元法
    G23线性方程组高斯消元法

    #include <bits/stdc++.h>
    using namespace std;
    const double eps = 1e-8;
    int n;
    double a[110][110], x[110];
    
    void gauss() {
        int r = 1; // r统计主元的个数+1 
        for (int c = 1; c <= n; c++) // 让第r行x[c]的系数不为零,r+1~n行x[c]的系数为0 
        {
            for (int i = r + 1; i <= n; i++) {
                while (fabs(a[i][c]) > eps) // 此处改为if也对 
                {
                    double bs = a[r][c] / a[i][c];
                    for (int j = 1; j <= n + 1; j++) {
                        a[r][j] = a[r][j] - a[i][j] * bs;
                    } swap(a[r], a[i]); // 交换两行
                }
            }
            if (fabs(a[r][c]) > eps) r++; // 找到主元,r自增
        }
        // 检查无解情况:第r行及以下存在非零常数项
        for (int i = r; i <= n; i++) {
            if (fabs(a[i][n + 1]) > eps) {
                printf("-1\n");
                return;
            } 
        }
        // 检查无穷多解情况:主元个数小于n
        if (r <= n) {
            printf("0\n");
            return;
        }
    
        // 回代求解
        for (int i = n; i >= 1; i--) {
            for (int j = i + 1; j <= n; j++) {
                a[i][n + 1] -= x[j] * a[i][j];
            }
            x[i] = a[i][n + 1] / a[i][i];
            if (fabs(x[i]) < eps) x[i] = fabs(x[i]); // 处理精度问题
        }
        // 输出解
        for (int i = 1; i <= n; i++) {
            printf("x%d=%.2lf\n", i, x[i]);
        }
    }
    
    int main() {
        scanf("%d", &n);
        // 读入增广矩阵
        for (int i = 1; i <= n; i++) {
            for (int j = n + 1; j >= 1; j--) {
                scanf("%lf", &a[i][j]);
            }
        }
        gauss();
        return 0;
    }
    
    • 0
      @ 2025-10-8 16:51:01

      G23 线性方程组 高斯消元法

      #include<bits/stdc++.h>
      using namespace std;
      const double eps=1e-8;
      int n;
      double a[110][110],x[110];
      void gauss()
      {
      	int r=1;//r统计主元的个数+1 
          for(int c=1;c<=n;c++)// 让第r行x[c]的系数不为零,r+1~n行x[c]的系数为0 
          {
          	for(int i=r+1;i<=n;i++)
          	{
          		while( fabs(a[i][c])>eps )//此处改为if也对 
          		{
          			double bs=a[r][c]/a[i][c];
          			for(int j=1;j<=n+1;j++)a[r][j]=a[r][j]-a[i][j]*bs;
          			swap(a[r],a[i]);
          		}
          	}
          	if(fabs(a[r][c])>eps) r++;
          }
      	//此时找到了 r-1 个主元 
      	for(int i=r;i<=n;i++)if(fabs(a[i][n+1])>eps) {printf("-1\n");return ;}
      	if(r<=n) {printf("0\n");return ;}
      
          for(int i=n;i>=1;i--)
      	{
      		for(int j=i+1;j<=n;j++)a[i][n+1]-=x[j]*a[i][j];
      		x[i]=a[i][n+1]/a[i][i];
      		if(fabs(x[i])<eps)x[i]=fabs(x[i]);
      	}
      	for(int i=1;i<=n;i++)printf("x%d=%.2lf\n",i,x[i]);
      }
      int main()
      {
          scanf("%d",&n);
          for(int i=1;i<=n;i++)for(int j=1;j<=n+1;j++)scanf("%lf",&a[i][j]);
          gauss();
          return 0;
      }

      • 1

      G23*【高斯消元】线性方程组[SDOI2006]

      信息

      ID
      521
      时间
      1000ms
      内存
      128MiB
      难度
      8
      标签
      递交数
      183
      已通过
      32
      上传者