• 基础数论--高斯消元


    高斯消元是线性代数的一种算法,可用来求解线性方程组问题。

    线性方程三大基本操作:

    1)两方程互换,解不变;
    2)一方程乘以非零数k,解不变;
    3)一方程乘以数k加上另一方程,解不变
     1 #include<iostream>
     2 #include<cmath>
     3 #include<algorithm>
     4 using namespace std;
     5 const int N=110;
     6 const double eps=1e-6;
     7 double a[N][N];
     8 int n;
     9 
    10 int gauss(){
    11     int r,c;
    12     for(r=0,c=0;c<n;c++){
    13         //1.找到绝对值最大的
    14         int t=r;
    15         for(int i=r;i<n;i++)
    16         if(fabs(a[i][c])>fabs(a[t][c]))
    17             t=i;
    18         if(fabs(a[t][c])<eps) continue;
    19         //2.把最大的换到上边
    20         for(int i=c;i<=n;i++) swap(a[t][i],a[r][i]);
    21         //3.把最大的c列变成1
    22         for(int i=n;i>=c;i--) a[r][i]/=a[r][c];
    23         //4.把下边的c列都变成0
    24         for(int i=r+1;i<n;i++)
    25             if(fabs(a[i][c])>eps)
    26                 for(int j=n;j>=c;j--)
    27                     a[i][j]-=a[r][j]*a[i][c];
    28         r++;
    29     }
    30     if(r<n){
    31         for(int i=r;i<n;i++){
    32             if(fabs(a[i][n])>eps){
    33                 return 1;
    34             }
    35         }
    36         return 2;
    37     }
    38     for(int i=n-1;i>=0;i--){
    39         for(int j=i+1;j<n;j++){
    40             a[i][n]-=a[i][j]*a[j][n];
    41         }
    42     }
    43     return 0;
    44 }
    45 int main(void){
    46     cin>>n;
    47     for(int i=0;i<n;i++){
    48         for(int j=0;j<=n;j++){
    49             cin>>a[i][j];
    50         }
    51     }
    52     int t=gauss();
    53     if(t==0){
    54         for(int i=0;i<n;i++){
    55             printf("%.2lf
    ",a[i][n]);
    56         }
    57     }else if(t==1){
    58         cout<<"No solution"<<endl;
    59     }else if(t==2){
    60         cout<<"Infinite group solutions"<<endl;
    61     }
    62     return 0;
    63 }

    异或版本的高斯消元

     1 #include<iostream>
     2 using namespace std;
     3 const int N=110;
     4 int n;
     5 int a[N][N];
     6 int gauss(){
     7     int r,c;
     8     for(r=0,c=0;c<n;c++){
     9         //找到1
    10         int t=r;
    11         for(int i=r;i<n;i++)
    12             if(a[i][c]){
    13                 t=i;
    14                 break;
    15             }
    16         if(a[t][c]==0) continue;
    17         //换上去
    18         for(int i=c;i<=n;i++){
    19             swap(a[r][i],a[t][i]);
    20         }
    21         //异或下边的
    22         for(int i=r+1;i<n;i++){
    23             if(a[i][c]){
    24                 for(int j=c;j<=n;j++){
    25                     a[i][j]^=a[r][j];
    26                 }
    27             }
    28         }
    29         r++;
    30     }
    31     if(r<n){
    32         for(int i=r;i<n;i++){
    33             if(a[i][n]){
    34                 return 1;
    35             }
    36         }
    37         return 2;
    38     }
    39     for(int i=n-1;i>=0;i--){
    40         for(int j=i+1;j<n;j++){
    41             a[i][n]^=a[i][j]&a[j][n];//a[i][j]为1时异或第j行
    42         }
    43     }
    44     return 0;
    45 }
    46 int main(void){
    47     cin>>n;
    48     for(int i=0;i<n;i++){
    49         for(int j=0;j<=n;j++){
    50             cin>>a[i][j];
    51         }
    52     }
    53     int t=gauss();
    54     if(t==0){
    55         for(int i=0;i<n;i++){
    56             cout<<a[i][n]<<endl;
    57         }
    58     }else if(t==1){
    59         cout<<"No solution";
    60     }else if(t==2){
    61         cout<<"Multiple sets of solutions";
    62     }
    63     return 0;
    64 }
     
  • 相关阅读:
    定义模块与增加模块中的测试代码
    20150412自省
    Python中暂未解决的问题
    Node基础_文件系统
    Node基础_Buffer缓冲区
    Node基础_npm简介
    Node基础_模块化简介及详解
    Node基础_node简介
    Nosql_Mongoose简介及操作
    Nosql_MongoDB简单的查询练习
  • 原文地址:https://www.cnblogs.com/greenofyu/p/14138582.html
Copyright © 2020-2023  润新知