高斯消元

例题P2455 [SDOI2006]线性方程组
在这里插入图片描述
高斯消元做法
首先声明一个变量存当前已经确定的方程组的数量

1.枚举每一列

2.找出每一列绝对值最大的一行

3.将该行放到最上面

4.将该行第一个系数变为1

3.将该列下面所有行的值变为0

代码实现

s q [ i ] [ j ] sq[i][j] sq[i][j]存的为第i行第j个系数

找出每一列绝对值最大的一行

for (int i = r; i <= n;i++)
	if(fabs(sq[i][j])>fabs(sq[t][j]))
     	t = i;

将该行放在最上面

for (int i = j; i <= n+1;i++)
	swap(sq[t][i], sq[r][i]);

r r r为当前已经确定的方程的数量,n+1存的为方程的值

将该行第一个系数变为1

for (int i = n+1; i >= j;i--)
     sq[r][i] /= sq[r][j];

j j j为当前枚举的列

将该列下面所有行的值变为0

for (int i = r + 1; i <= n;i++)
{
    if(fabs(sq[i][j])>eps)
    {
        for (int k = n + 1; k >= j;k--)
            sq[i][k] -= sq[r][k] * sq[i][j];
    }
}

最后判断解的情况

r < n r<n r<n说明最后确定的方程数量不足n个,可能是无解或者无穷解,若无解,则说明出现 0 ! = 0 0!=0 0!=0的情况

求解

    if(r<=n)
    {
        for (int i = r; i <= n;i++)
            if(fabs(sq[i][n+1])>eps)
                return 2;
        return 1;
    }
    for (int i = n; i >= 1;i--)
    {
        for (int j = i + 1; j <= n;j++)
            sq[i][n+1] -= sq[i][j] * sq[j][n+1];
    }
    return 0;
posted @ 2020-08-28 08:00  DSHUAIB  阅读(75)  评论(0)    收藏  举报