高斯消元解:多元一次方程,多元异或方程

多元一次方程

模板题:
多元一次方程
线性代数解多元一次方程,一个小bug卡了半天。。。
思路:
1.在一列中找到绝对值最大的数
2.将该行换到最上面
3.将该行第一个元素变成1
4.消去剩下行的第一个数

#include<iostream>
#include<cmath>

#include<cstdio>

using namespace std;

const double eps = 1e-6;

double arr[105][105];
int n;

// void debug() {
    
    
//     for (int i = 0; i < n; i++) {
    
    
//         for (int j = 0; j <= n; j++) {
    
    
//             cout << arr[i][j] << " ";
//         }
//         cout << endl;
//     }
// }

int gaoss() {
    
    
    int c, r;
    for (c = 0, r = 0; c < n; c++) {
    
    
        int t = r;
        for (int i = r; i < n; i++) {
    
    //找到最大的一行
            if (fabs(arr[i][c]) > fabs(arr[t][c]))
                t = i;
        }
        if (fabs(arr[t][c]) <= eps) continue;//这一行不算入秩
        for (int i = c; i <= n; i++) swap(arr[r][i], arr[t][i]);//将最大值换到最上面
        for (int i = n; i >= c; i--)arr[r][i] /= arr[r][c]; //把最大行的第一个数变成1
        for (int i = r + 1; i < n; i++) {
    
    
            if (fabs(arr[i][c]) > eps) {
    
    //头值非零
                for (int j = n; j >= c; j--) {
    
    
                    arr[i][j] -= arr[i][c] * arr[r][j];
                }
            }
        }
        r++;
    }//行阶梯式转换完成
    // debug();
    if (r < n) {
    
    
        for (int i = r; i < n; i++) {
    
    
            // cout<<arr[i][n]<<endl;
            if (fabs(arr[i][n]) > eps) {
    
    
                return 2;
            }
        }
        return 1;
    }
    for (int i = n - 1; i >= 0; i--) {
    
    
        for (int j = i + 1; j < n; j++) {
    
    
            arr[i][n] -= arr[i][j] * arr[j][n];
        }
    }
    return 0;
}

int main() {
    
    
    cin >> n;
    for (int i = 0; i < n; i++) {
    
    
        for (int j = 0; j < n + 1; j++) {
    
    
            scanf("%lf", &arr[i][j]);
        }
    }
    int t = gaoss();
    if (t == 0) {
    
    
        for (int i = 0; i < n; i++)
            printf("%.2f\n", arr[i][n]);
    }
    else if (t == 1) {
    
    
        cout << "Infinite group solutions" << endl;
    }
    else {
    
    
        cout << "No solution" << endl;
    }
    return 0;
}

多元异或方程:

思路同上
x^y=z解x的方法是:x^y^y=z^y − − > --> >x=z^y
多元异或方程
代码:

#include<iostream>

using namespace std;

const int N = 1e2 + 5;

int arr[N][N];
int n;

int gauss() {
    
    
    int c, r;
    for (c = r = 0; c < n; c++) {
    
    
        //化上三角
        int t = r;
        for (int i = r; i < n; i++) {
    
    
            if (arr[i][c] > arr[t][c]) t = i;
        }
        if (arr[t][c] == 0) continue;
        for (int i = c; i < n + 1; i++)swap(arr[r][i], arr[t][i]);
        for (int i = r + 1; i < n; i++) {
    
    
            if (arr[i][c]) {
    
    
                for (int j = c; j < n + 1; j++) {
    
    
                    arr[i][j] ^= arr[r][j] ;
                }
            }
        }
        r++;
    }
    if (r < n) {
    
    
        for (int i = r; i < n; i++) {
    
    
            if (arr[i][n] != 0)
                return 2;
        }
        return 1;
    }
    for (int i = n - 1; i >= 0; i--) {
    
    
    //化单位矩阵
        for (int j = i + 1; j < n; j++) {
    
    
            arr[i][n] ^= arr[i][j] * arr[j][n];
        }
    }
    return 0;
}

int main() {
    
    
    cin >> n;
    for (int i = 0; i < n; i++) {
    
    
        for (int j = 0; j < n + 1; j++) {
    
    
            cin >> arr[i][j];
        }
    }                     
    int k = gauss();
    if (k == 0) {
    
    
        for (int i = 0; i < n; i++) {
    
    
            cout << arr[i][n] << endl;
        }
    }
    else if (k == 1) {
    
    
        cout << "Multiple sets of solutions" << endl;
    }
    else {
    
    
        cout << "No solution" << endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45931661/article/details/119957288
今日推荐