求矩阵的逆

不甘心寒假就要收尾了。

回到学校,整理完行李,再收拾一下U盘里的东西。看到刚学线代那会儿瞎整的求矩阵的逆的代码。

#include <iostream>
#include <cstring>
using namespace std;
int a[11][11],b[11][11],M[11][11],A[11][11];
int n,nx,ans,ans2,nx2;
int c[11],co[11],tem[11],temp[11],co2[11];
int gcd(int a,int b){
     return (a%b)?gcd(b,a%b):b;
}
void hj(){
    int g;
    g=M[1][1];
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++){
      if(g==1||!g)return;
      g=gcd(g,M[i][j]);
    }
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
      M[i][j]/=g;
    if (!(ans2%g))
    {
            ans2/=g;
            if(ans2!=1&&ans2>0){
            cout<<"1/"<<ans2<<"*"<<endl;
            return;
            }
            if(ans2!=1&&ans2<0){
            cout<<"-1/"<<ans2<<"*"<<endl;
            return;
            }
    }else {
        if(ans2>0)cout<<g<<"/"<<ans2<<"*"<<endl;
        if(ans2<0)cout<<"-"<<g<<"/"<<-ans2<<"*"<<endl;
        return;
    }
}
void ds(int i,int j){//构造代数余子式 
    int row,col;
    row=col=1;
    for(int k=1;k<=n;k++){
        col=1;
        if (k!=i){//除了第i行 
            for(int v=1;v<=n;v++)
                if(v!=j){//除了第j列 
                    b[row][col]=a[k][v];//第row行第col列为 
                    col++;
                }
            row++;    
        }    
    }    
}
void add(int r){
    if(r==n){
        int sum=1;
        for(int i=1;i<n;i++)
                sum*=tem[i];
        if(nx %2)
            ans-=sum;//奇数 ,-1 
        else ans+=sum;
    }else{
    for(int i=1;i<n;i++)
    {
        if(!co[i]){
            co[i]=1;
            int nxs=0;
            for(int j=i+1;j<n;j++)
                if(j<n&&co[j])nxs++;
            nx+=nxs;
            tem[r]=b[r][i];
            add(r+1);
            tem[r]=0;
            nx-=nxs;
            co[i]=0;
        }
    }
    }
}
void add2(int r){
    if(r==n+1){
        int sum=1;
        for(int i=1;i<=n;i++)
                sum*=temp[i];
        if(nx2 %2)
            ans2-=sum;
        else ans2+=sum;
    }else{
    for(int i=1;i<=n;i++)//现在是第r行,我取第i列的元素 
    {
        if(!co2[i]){
            co2[i]=1;
            int nxs=0;
            for(int j=i+1;j<=n;j++)//列举比i大的数 
                if(co2[j])nxs++;//如果第j列已选择,逆序数+1 
            nx2+=nxs;//统计到总的逆序数里 
            temp[r]=a[r][i];
            add2(r+1);
            temp[r]=0;
            nx2-=nxs;
            co2[i]=0;
        }
    }
    }
}
void work(){
        for(int i=1;i<=n;i++)
             for(int j=1;j<=n;j++) 
             {
                 ds(i,j);
                 memset(co,0,sizeof(co));
                 memset(tem,0,sizeof(tem));
                 nx=0;
                 ans=0;
                 add(1);
                 if((i+j)%2)M[j][i]=-ans;//代数余子式不要忘记-1的i+j次方 
                 else M[j][i]=ans;
             }    
}
void ansprintf(){
    cout<<"答案是:"<<endl;
    hj();    
    for(int i=1;i<=n;i++){
    for(int j=1;j<=n;j++)
        cout<<M[i][j]<<" ";
    cout<<endl;
    }
}
void judge(){
    memset(co2,0,sizeof(co2));
    memset(temp,0,sizeof(temp));
    nx2=0;
    ans2=0;
    add2(1);
    if(ans2)
    {
    work();
    ansprintf();
    }
    else cout<<"这是一个奇异矩阵(等于0),不能求逆哦!"<<endl;
}
void init(){
    cin>>n;
    
    if(!n){
        cout<<"再见!"<<endl;
        getchar();getchar(); }
    else{
     if(n>10 or n<0)cout<<"TAT 这么难,不要耍宝宝啊!"<<endl;
    else 
    {
        cout<<"那现在你可以输入这个矩阵了,我不会算有分数和小数的矩阵哦!\n(请化为全部是整数的矩阵再输入)"<<endl;
        memset(c,0,sizeof(c));
        for(int i=1;i<=n;i++)
             for(int j=1;j<=n;j++)
                cin>>a[i][j];
        judge();    
    }
    cout<<"继续输入你要求解的矩阵的阶数(输入0结束程序):"<<endl;
    init(); 
    }
}
int main(){
    cout<<"输入你要求解的矩阵的阶数(输入0结束程序):"<<endl;
    init(); 
}

 

  

posted @ 2016-02-26 17:57  水郁  阅读(408)  评论(0编辑  收藏  举报
……