C语言递归计算简易行列式
刚接触C语言没多久,可能有不少用法错误之类的存在,各位在浏览时如果发现了,希望能够指正,再次先行谢过。
对于已发现而尚未解决的问题如下:
1.第一次输入为字符时,未出现错误提示;
2.主函数中注释的printf出现的问题;
3.输入行列式时,不能实现回车只读入每行的 个数。
还请各位多多指教,谢谢。
#include<stdio.h>
//计算一组数的逆序数,并转换,理论上奇负偶正。
int Nixushu(int *p,int n)
{
int m=0;
for(int i=n-1;i>0;i--)
for(int j=0;j<i;j++)
if(*(p+j)>*(p+i))
m++;
if(m%2) return -1;
else return 1;
}
/*
数组前个n数整体向右移动一格。
配合Det函数得到行列式的全排序。
*/
void Move(int *p,int n)
{
int m;
for(int i=n-1;i>0;i--)
{
m = *p;
*p = *(p+i);
*(p+i) = m;
}
}
/*
行列式累加计算,指针p控制排序,指针d储存输入的行列式,
n,a都是阶数,n辅助递归,a辅助每种排序的累乘。
*/
void Det(int *p,int *d,int n,int a)
{
for(int j=0;j<n;j++)
{
Move(p,n); // 通过递归,得到行列式的n!种排序,指针p储存排序。
if(n>1)
Det(p,d,n-1,a); // 实现递归
else
{
int c = Nixushu(p,a); // 得到每种排序的正负
// printf("%d ",c); // 检查行列式的逆序数,奇负偶正。
for(int i=0;i<a;i++)
c *= *(d+(i*a+*(p+i)+1)); // 依此乘以行列式第i行第*(p+i)+1列的值。
*(p+a) += c;
// printf("%d ",*(p+a)); //
}
}
}
int main()
{
while(1)
{
int m=0;
printf("请输入行列式的阶数N(不超过15): ") ;
scanf("%d",&m); // 输入行列式的阶数
// printf("\n"); // 增添此句,结果错误,原因尚不明
int array[m+1],hls[m*m+1]; // 数组array[0 ~ m-1]储存行列式排序,array[m]储存行列式按排序累乘后的累加值,数组hls储存行列式。
for(int i=0;i<m;i++) // 给数组array赋初始排序。
array[i]=i;
if(m>15 || m<0) // 检查行列式的阶数是否符合范围。
{
printf("\nN超出范围,按任意键字符退出……\n");
scanf("%*c%*c");
exit(0); //退出程序。
}
printf("\n");
for(int i=0; i<m*m; i++) // 输入行列式。
{
if(i%m==0) // 控制每行输入个数。
printf("请输入行列式第%d行: ",i/m+1);
scanf("%d",&hls[i+1]);
}
printf("\n输入的行列式为:\n"); // 输出已输入的行列式
for(int i=1; i<m*m+1; i++)
{
if(i%m==1||m==1) printf(" |");
// 输出行列式的左边线
printf("%4d",hls[i]);
if(i%m==0) printf(" |\n");
// 输出行列式的右边线
}
printf("\n");
int *p_array= array,*p_hls= hls;
Det(p_array,p_hls,m,m); // 行列式计算
printf("行列式的值为: %d",*(p_array+m));
printf("\n\n输入任意字符继续计算,输入Q退出程序....\n") ;
getchar() ; //接收输入行列式时的回车符
if(getchar()=='Q' || getchar()=='q')
break ;
}
return 0;
}