2021-01-06

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值