您的位置:首页 > 编程语言 > C语言/C++

C语言 n*n矩阵求值及求逆矩阵

2016-06-15 18:16 405 查看


求出矩阵的值以及输出逆矩阵,英语不好,略拗口。

上代码:

#include<stdio.h>
#include<string.h>
#include<math.h>
int map1[110][110],i,j,k,l,m,n,p,vis[110][110],num;
int just[110][110];
int just2[110][110];
void print(int map[][110],int n)//打印矩阵
{
int j;
for(int i=1;i<=n;i++)
{
for(j=1;j<n;j++)
printf("%d ",map[i][j]);
printf("%d\n",map[i][j]);
}
}
int slove(int map[][110],int n)//三阶行列式求值,高阶的请自动忽略
{
memset(vis,0,sizeof(vis));
int i,j,ans=0;
if(n==1)
return map[1][1];
if(n==2)
return map[1][1]*map[2][2]-map[1][2]*map[2][1];
for(i=1;i<=n;i++)
{
int help=1;
for(j=0;j<n;j++)
{
int cnt=i+j;
cnt%=n;
if(cnt==0)
cnt=n;
if(!vis[1+j][cnt])
{
//printf ("%d %d ",1+j,cnt);
help*=map[1+j][cnt];
vis[1+j][cnt]=1;
}
else
break;
//printf("\n");
}
ans+=help;
}
memset(vis,0,sizeof(vis));
for(i=1;i<=n;i++)
{
int help=1;
for(j=0;j<n;j++)
{
int cnt=i+j;
cnt%=n;
if(cnt==0)
cnt=n;
if(!vis[n-j][cnt])
{
help*=map[n-j][cnt];
vis[n-j][cnt]=1;
}
}
ans-=help;
}
return ans;
}
void get(int numi,int numj,int map[][110],int n)//得到余子式
{
// memset(just,0,sizeof(just));
int help[110][110],i,j,k,l;
for(i=0;i<n+10;i++)
for(j=0;j<n+10;j++)
help[i][j]=1;
for(i=1;i<=n-1;i++)//求余子式矩阵
for(j=1;j<=n-1;j++)
{
if(i>=numi&&j<numj)
help[i][j]=map[i+1][j];
else if(i>=numi&&j>=numj)
help[i][j]=map[i+1][j+1];
else if(i<numi&&j>=numj)
help[i][j]=map[i][j+1];
else if(i<numi&&j<numj)
help[i][j]=map[i][j];
}
// print(help,n-1);
for(i=0;i<=n-1;i++)
for(j=0;j<=n-1;j++)
just[i][j]=help[i][j];
// if(n==2)
// return help[1][1];
// else
// {
// int nmd=0;
// for(i=1;i<=n;i++)
// {
// if(i%2==1)
// nmd+=help[1][i]*get(1,i,map,n);
// else
// nmd-=help[1][i]*get(1,i,map,n);
// for(int nn=1;nn<=n-1;nn++)
// for(int mm=1;mm<=n-1;mm++)
// map[nn][mm]=help[nn][mm];
// }
// return nmd;
// }
//print(help,n-1);
// int Ans=slove(help,n-1);
//printf("+++%d\n",Ans);
// return Ans;
}
int getans(int nn)//求当前行列式为just时,just的值。
{
int map[110][110];
for(int i=1;i<=nn;i++)
for(int j=1;j<=nn;j++)
map[i][j]=just[i][j];
if(nn==2)
return map[1][1]*map[2][2]-map[1][2]*map[2][1];
else if(nn==1)
return map[1][1];
else
{
int cnb=0;
for(int i=1;i<=nn;i++)
{
get(1,i,map,nn);//得到当前余子式 just
// printf("pay attention!\n");
//print(map,nn);
//print(just,nn-1);
if(i%2==1)
cnb+=map[1][i]*getans(nn-1);
else
cnb-=map[1][i]*getans(nn-1);
}
return cnb;
}
}
int gcd(int m,int n)//求逆矩阵时约分
{
if(m<n)
gcd(n,m);
if(n==0)
return m;
else
return gcd(n,m%n);
}
void final(int n,int m)//打印当前两个值相除得到的最简分数
{
if(n*m<0)
{
printf("-");
final(fabs(n),fabs(m));
return ;
}
//printf("%d %d /////%d\n",n,m,gcd(n,m));
if(m==1)
printf("%d\t",n);
else if(n%m==0)
printf("%d\t",n/m);
else
printf("%d/%d\t",n/gcd(n,m),m/gcd(n,m));
}
int main()
{
while(1)
{
printf("please input the determinant`s size:\n");//输入矩阵的规格
scanf("%d",&n);
// memset(map,1,sizeof(map));
for(i=0;i<n+10;i++)
for(j=0;j<n+10;j++)
map1[i][j]=1;
int ans=0;
printf("please input the determinant:\n");//输入矩阵
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
scanf("%d",&map1[i][j]);
just[i][j]=map1[i][j];//just即 为当前矩阵
}
printf("the value of the determinant is:\n");
//int help1=slove(map1,n);
int ans1=getans(n);//矩阵的值
printf("ans is %d\n",ans1);
// printf("%d\n",help1);
int map2[110][110];
for(i=1;i<=n;i++)//求转置行列式
for(j=1;j<=n;j++)
{
map2[i][j]=map1[j][i];
just[i][j]=map2[i][j];
}
printf("Transpose the determinant is:\n"); //转置矩阵
printf("the value of the determinant is:\n"); //转置矩阵的值
print(map2,n);
//int help2=slove(map2,n);
int help2=getans(n);
printf("%d\n",help2);
if(help2==0)
{
printf("this matrix dont have inverse matrix!!!\n");
continue;//矩阵值为0,无逆矩阵
}
printf("***************\n");
printf("inverse matrix is:\n");//输出逆矩阵
int Num=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
get(i,j,map2,n);//得到当前just
//printf("+++++++++++\n");
//print(just,n-1);
//printf("+++++++++++\n");
//printf("+-*/%d\n",getans(n-1));
if((i+j)%2==0)
final(getans(n-1),ans1);
else
final(-1*getans(n-1),ans1);
}
printf("\n");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息