如何用c语言来求一个四阶行列式的值

希望可以简洁明了,并且有注释。... 希望可以简洁明了,并且有注释。 展开
 我来答
水上漂汤
推荐于2017-09-02 · TA获得超过1万个赞
知道大有可为答主
回答量:1830
采纳率:71%
帮助的人:1442万
展开全部
用递归写了一个求n阶行列式的算法。用4阶行列式举例:
1 2 3 4
5 6 7 8
4 3 2 1
8 7 6 5
为了方便计算,我没有用二维数组。
把矩阵用一维数组A存起来,并指出维数n。
第i行第j列的元素的下标是i*n+j
#include <stdio.h>
#include <stdlib.h>

//求余子式M的函数,参数是矩阵,维数,i行,j列
//比如M(A, 4, 0, 0)表示去掉第1列,第1列的元素后剩下的数组成一个数组
//6 7 8
//3 2 1
//7 6 5
//然后用A[i*n+j]和余子式的值相乘
int* M(int *A, int n, int i, int j)
{
    int *B= (int*)malloc((n - 1)*sizeof(int));
    int k = 0;
    for (int k1 = 0; k1 < n; ++k1)
    {
        if (k1 != i)
            for (int k2 = 0; k2 < n; ++k2)
                if (k2 != j)
                    B[k++] = A[k1*n + k2];
    }
    return B;
}

int det(int A[], int n)
{
    int sum = 0, N = n*n;
    if (n == 1)
        sum = A[0];
    else
    {
        for (int i = 0; i < n; ++i)
        {
            int *tmp = M(A, n, i, 0);
            int Aij = A[i*n]*det(tmp, n - 1);
            if (i%2 != 0)
                Aij = -Aij;
            sum = sum + Aij;
            
        }
    }
    return sum;
}

int main()
{
    int A[]={2,1,3,-1,1,-5,1,1,2,3,2,2,0,-1,4,2};
    printf("%d\n", det(A, 4));
    return 0;
}
L语言之父
推荐于2017-10-07 · TA获得超过3622个赞
知道小有建树答主
回答量:811
采纳率:0%
帮助的人:94.3万
展开全部
#include <stdio.h>
#include <stdlib.h>
#define MAX 9 /*定义最大为9阶行列式*/

int Fun(int n, int a[MAX][MAX] ); /*函数声明*/
int main()
{
int n = 0; /*初始化阶数n*/
int i = 0, j = 0; /*i,j分别表示行与列*/
int a[MAX][MAX] = {{0}}; /*定义行列式*/

scanf("%d",&n); /*读入阶数*/
while( n != 0) /*输入为0时退出程序*/
{
for( i = 0; i < n; i++) /*此处2次循环将行列式存入数组中*/
{
for( j = 0; j < n; j++)
scanf("%d", &a[i][j]);
}
printf("%d\n", Fun( n, a ) );
scanf("%d", &n);
}

return 0;
}

/*以下为计算行列式值的递归函数*/
int Fun( int n, int a[MAX][MAX] )
{
int b[MAX][MAX] = {{0}}; /*定义数组b并初始化*/
int i = 0, j = 0, sum = 0; /*i,j为行与列,sum为行列式的值*/
int x = 0,c = 0,p=0; /*用x判断加与减,c,p为中间变量*/

if(n == 1)
return a[0][0];

for(i = 0;i < n; i++) /*此处大循环实现将余子式存入数组b中*/
{
for(c = 0;c < n-1; c++)
{
for(j = 0;j < n-1;j++)
{
if (c < i){ /*借助c判断每行的移动方法*/
p = 0; /*当p=0时,行列式只向左移,即消去对应的第一列的数*/
}
else{ /*否则行列式左移后再上移*/
p = 1;
}
b[c][j] = a[c+p][j+1];
}
}

if(i % 2 == 0){ /*i+j(此时j=0,故只考虑i)为偶数,加法预算*/
x = 1;
}
else{ /*i+j为奇数,减法运算*/
x = (-1);
}
sum += a[i][0] * Fun(n - 1, b ) * x; /*计算行列式的值*/
}

return sum; /*将值返回*/
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
程序猿的独白
2014-12-09 · 超过28用户采纳过TA的回答
知道答主
回答量:106
采纳率:0%
帮助的人:56.4万
展开全部
#include <stdio.h>
static int two(int a_2[2],int b_2[2])
{
int n;
n=a_2[0]*b_2[1]-a_2[1]*b_2[0];
return(n);
}

static int three(int a_3[3],int b_3[3],int c_3[3])
{
int *p_1=a_3,*p_2=b_3,*p_3=c_3;
int n;
/**/
n=(*p_1)*(*(p_2+1))*(*(p_3+2))+(*(p_1+1))*(*(p_2+2))*(*p_3)+(*(p_1+2))*(*p_2)*(*(p_3+1))-(*p_3)*(*(p_2+1))*(*(p_1+2))-(*p_2)*

(*(p_1+1))*(*(p_3+2))-(*p_1)*(*(p_2+2))*(*(p_3+1));
return(n);
}
static int four(int a_4[],int b_4[],int c_4[],int d_4[])
{
int *p_1=a_4,*p_2=b_4,*p_3=c_4,*p_4=d_4;
int n;
/*代数余子式*/
n=(*p_1)*(three(p_2+1,p_3+1,p_4+1))-(*p_2)*(three(p_1+1,p_3+1,p_4+1))+(*p_3)*(three(p_1+1,p_2+1,p_4+1))-(*p_4)*(three

(p_1+1,p_2+1,p_3+1));
return(n);
}
static int five(int a_5[],int b_5[],int c_5[],int d_5[],int e_5[])
{
int n;
int *p_1=a_5,*p_2=b_5,*p_3=c_5,*p_4=d_5,*p_5=e_5;
/*代数余子式*/
n=(*p_1)*(four(p_2+1,p_3+1,p_4+1,p_5+1)) - (*p_2)*(four(p_1+1,p_3+1,p_4+1,p_5+1)) + (*p_3)*(four(p_1+1,p_2+1,p_4+1,p_5+1)) - 

(*p_4)*(four(p_1+1,p_2+1,p_3+1,p_5+1)) + (*p_5)*(four(p_1+1,p_2+1,p_4+1,p_4+1));
return(n);
}
static int six(int a_6[],int b_6[],int c_6[],int d_6[],int e_6[],int f_6[])
{
int n;
int *p_1=a_6,*p_2=b_6,*p_3=c_6,*p_4=d_6,*p_5=e_6,*p_6=f_6;
/*代数余子式*/
n=(*p_1)*(five(p_2+1,p_3+1,p_4+1,p_5+1,p_6+1)) - (*p_2)*(five(p_1+1,p_3+1,p_4+1,p_5+1,p_6+1)) + (*p_3)*(five

(p_1+1,p_2+1,p_4+1,p_5+1,p_6+1)) -(*p_4)*(five(p_1+1,p_2+1,p_3+1,p_5+1,p_6+1)) + (*p_5)*(five(p_1+1,p_2+1,p_3+1,p_4+1,p_6+1)) - 

(*p_6)*(five(p_1+1,p_2+1,p_3+1,p_4+1,p_5+1));
return(n);
}
/*行列式是:3阶以上的直接嵌套的调用余子式*/
void main()
{
int a[6],b[6],c[6],d[6],e[6],f[6];
int i=0,n,flag;
scanf("%d",&n);  /*n为几阶行列式*/

flag=0;
while(n!=0)
{
if(flag<n)
{ printf("input first row number!\n");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
flag++;
}
else break;
if(flag<n)
{
printf("input second row number!\n");
for(i=0;i<n;i++)
scanf("%d",&b[i]);
flag++;
}
else break;
if(flag<n)
{ printf("input third row number!\n");
for(i=0;i<n;i++)
scanf("%d",&c[i]);
flag++;
}
else break;
if(flag<n)
{ printf("input fourth row number!\n");
for(i=0;i<n;i++)
scanf("%d",&d[i]);
flag++;
}
else break;
if(flag<n)
{ printf("input fifth row number!\n");
for(i=0;i<n;i++)
scanf("%d",&e[i]);
flag++;
}
else break;
if(flag<n)
{ printf("input sixth row number!\n");
for(i=0;i<n;i++)
scanf("%d",&f[i]);
flag++;
}
else break;
};

switch(n)
{
case 1:
printf("%d\n",*a);break;
case 2:
printf("%d\n",two(a,b));break;
case 3:
printf("%d\n",three(a,b,c));break;
case 4:
printf("%d\n",four(a,b,c,d));break;
case 5:
printf("%d\n",five(a,b,c,d,e));break;
case 6:
printf("%d\n",six(a,b,c,d,e,f));break;
default:printf("input train more than six or not number at one!\n");
};
}
这是读书的时候建立的行列式求值,效率并不高;方法就是以代数余子式的方法嵌套得出来的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式