高斯消元
例题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;

浙公网安备 33010602011771号