行列式を求める関数(C++用)

なんとなく貼ってみる。
n×nの行列aの行列式の値|a|を求める。
まぁ実質C言語だけど。forループ用の変数の宣言あたりがC++風。

int determinant(int **a,int n){
  if(n==1)
    return a[0][0];
  else if(n==2)
    return a[0][0]*a[1][1]-a[0][1]*a[1][0];
  else{
    int **b;
    int d=0,s=(n+1)%2?-1:1;

    b=(int **)malloc(sizeof(int *)*(n-1));
    for(int i=0;i<n-1;i++) 
      b[i]=(int *)malloc(sizeof(int)*(n-1));

    for(int k=0;k<n;k++){ 
      for(int i=0;i<n-1;i++){ 
          for(int j=0;j<n;j++){ 
            if(j!=k){
              b[i][j-(j>k)]=a[i][j];
            }
          }
      }
      /*
      printf("%d\n",s*a[n-1][k]);
      for(int i=0;i<n-1;i++){ 
        for(int j=0;j<n-1;j++) 
          printf("%d ",b[i][j]);
        puts("");
      }
      puts("");*/
      d+=(s*a[n-1][k]*determinant(b,n-1));
      s*=-1;
    }
    free(b);
    return d;
  }
}