import java.util.*
import java.text.*
public class matrix {
static int map1[][]=new int [110][110]
static int just[][]=new int [110][110]
public static void printf(int n,int map[][])
{
int i,j
for(i=1i<=ni++ )
{
for(j=1j<nj++)
System.out.print(map[i][j]+" ")
System.out.println(map[i][j])
}
}
public static void get(int numi,int numj,int map[][],int n)
{
int i,j,k,l
for(i=0i<n+10i++)
for(j=0j<n+10j++)
just[i][j]=1
for(i=1i<=n-1i++)//求余子式矩阵
for(j=1j<=n-1j++)
{
if(i>=numi&&j<numj)
just[i][j]=map[i+1][j]
else if(i>=numi&&j>=numj)
just[i][j]=map[i+1][j+1]
else if(i<numi&&j>=numj)
just[i][j]=map[i][j+1]
else if(i<numi&&j<numj)
just[i][j]=map[i][j]
}
}
//static int map[][]=new int [110][110]
public static int getans(int nn)
{
int map[][]=new int [110][110]
for(int i=1i<=nni++)
for(int j=1j<=nnj++)
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=1i<=nni++)
{
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
}
}
public static int gcd(int m,int n)
{
// if(m<n)
// matrix.gcd(n,m)
// if(n==0)
// return m
//
// else
// return matrix.gcd(n,m%n)
int mm=m
int nn=n
if(mm<nn)
{
int c=mm
mm=nn
nn=c
}
int w=1
while(w!=0)
{
w=mm%nn
mm=nn
nn=w
}
return mm
}
public static void ans(int n,int m)
{
if(n*m<0)
{
System.out.print("-")
ans(Math.abs(n),Math.abs(m))
return
}
if(m==1)
System.out.print(n+"\t")
else if(n%m==0)
System.out.print(n/m+"\t")
else
System.out.print((n/matrix.gcd(m, n))+"/"+(m/matrix.gcd(m, n))+"\t")
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner cin=new Scanner(System.in)
int i,j,k,l,m,p
while(true)
{
int n=cin.nextInt()
int ans=0
for(i=0i<n+10i++)
for(j=0j<n+10j++)
map1[i][j]=1
for(i=1i<=ni++)
for(j=1j<=nj++)
{
map1[i][j]=cin.nextInt()
just[i][j]=map1[i][j]
}
int ans1=matrix.getans(n)
System.out.println("矩阵的值为:")
System.out.println(ans1)
int map2[][]=new int [110][110]
for(i=1i<=ni++)
for(j=1j<=nj++)
{
map2[i][j]=map1[j][i]
just[i][j]=map2[i][j]
}
System.out.println("转置矩阵为:")
matrix.printf(n, map2)
int help2=matrix.getans(n)
System.out.println(help2)
if(help2==0)
{
System.out.println("No inverse matrix")
continue
}
System.out.println("逆矩阵为:")
for(i=1i<=ni++)
{
for(j=1j<=nj++)
{
matrix.get(i, j, map2, n)
//boolean b=((i+j)%2==0)
if((i+j)%2==0)
matrix.ans(matrix.getans(n-1), help2)
else
matrix.ans(matrix.getans(n-1)*-1, help2)
}
System.out.println()
}
System.out.println()
}
}
}
/*** 矩阵乘法
* @param a
* @param b
* @return
*/
public static double[][] mulMatrix(double[][] a,double[][] b){
double[][] c=new double[a.length][b[0].length]
//相乘的两个行列式需要满足,第一个行列式的列于第二个行列式的行相等
if(a[0].length!=b.length){
System.out.println("Wrong parameters.")
return c
}
//若A为mXn矩阵,B为nXp矩阵,返回一个mXp的矩阵
for (int i = 0 i < c.length i++) {
for (int j = 0 j < c[0].length j++) {
for (int j2 = 0 j2 < a[0].length j2++) {
c[i][j]=c[i][j]+a[i][j2]*b[j2][j]
}
}
}
return c
} /**
* 计算行列式的值
* @param a
* @return
*/
static double determinant(double[][] a){
double result2 = 0
if(a.length>2){
//每次选择第一行展开
for(int i=0i<a[0].lengthi++){
//系数符号
double f=Math.pow(-1,i)
//求余子式
double[][] yuzs=new double[a.length-1][a[0].length-1]
for (int j = 0 j < yuzs.length j++) {
for (int j2 = 0 j2 < yuzs[0].length j2++) {
//去掉第一行,第i列之后的行列式即为余子式
if(j2<i){
yuzs[j][j2]=a[j+1][j2]
}else {
yuzs[j][j2]=a[j+1][j2+1]
}
}
}
//行列式的拉普拉斯展开式,递归计算
result2+=a[0][i]*determinant(yuzs)*f
}
}
else{
//两行两列的行列式使用公式
if(a.length==2){
result2=a[0][0]*a[1][1]-a[0][1]*a[1][0]
}
//单行行列式的值即为本身
else{
result2=a[0][0]
}
}
return result2
}
转自