运用 拉普拉斯展开法 求 行列式 的程序可以运行,但无法输出结果
程序出现死循环类问题
//说明:该程序是一个计算行列式的程序,
//所运用的数学原理是拉普拉斯按行(列)展开,
//将高阶的行列式转化为低阶行列式以简化运算
#include
#include
#include
int main()
{
void input(float *matrix,int n);//输入行列式
float det(float *matrix,int n);//求行列式的值
int n;
float *matrix=NULL;
printf("请问您想求解几阶行列式? ");
scanf("%d",&n);
matrix=(float *)calloc(n*n,sizeof(float));
input(matrix,n);
printf("\n行列式的值为%f",det(matrix,n));
return 0;
}
void input(float *matrix,int n)
{
printf("请一行一行地输入行列式的元素\n");
float *p;
p=matrix;
int i,j;
for(i=0;ifor(j=0;jscanf("%f",matrix+i*n+j);
}
}
matrix=p;//进行指针的复位
}
float det(float *matrix,int n)//递归
{
void minor(float *p,float *matrix,int m,int n);
float s=0,*p=NULL;
int i;
if(n==1) return(*matrix);
else
{ for(i=0;ifloat *)calloc((n-1)*(n-1),sizeof(float));
minor(p,matrix,i,n);
s=s+pow(-1,i)*det(p,n-1);
free(p);
}
return s;
}
}
void minor(float *p,float *matrix,int m,int n)
//求行列式第1行第m列的余子式,
//我想的是就搞一个n-1阶的方阵,
//然后把原来n阶的方阵去一行去一列放进去
{
int i,j,J;
float *bf=matrix;
for(i=1;ifor(j=0,J=0;j-1;J++)
{ if(j==m) continue;
else
{ *(p+(i-1)*(n-1)+j)=*(matrix+i*n+J);
j++;
}
}
}
matrix=bf;//进行指针的复位
}
曾尝试检查递归有限性,还检查了其它循环,并未发现死循环……
能正确地输出结果。