求矩阵的逆
不甘心寒假就要收尾了。
回到学校,整理完行李,再收拾一下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(); }
┆凉┆暖┆降┆等┆幸┆我┆我┆里┆将┆ ┆可┆有┆谦┆戮┆那┆ ┆大┆始┆ ┆然┆
┆薄┆一┆临┆你┆的┆还┆没┆ ┆来┆ ┆是┆来┆逊┆没┆些┆ ┆雁┆终┆ ┆而┆
┆ ┆暖┆ ┆如┆地┆站┆有┆ ┆也┆ ┆我┆ ┆的┆有┆精┆ ┆也┆没┆ ┆你┆
┆ ┆这┆ ┆试┆方┆在┆逃┆ ┆会┆ ┆在┆ ┆清┆来┆准┆ ┆没┆有┆ ┆没┆
┆ ┆生┆ ┆探┆ ┆最┆避┆ ┆在┆ ┆这┆ ┆晨┆ ┆的┆ ┆有┆来┆ ┆有┆
┆ ┆之┆ ┆般┆ ┆不┆ ┆ ┆这┆ ┆里┆ ┆没┆ ┆杀┆ ┆来┆ ┆ ┆来┆