3个回答
展开全部
用递归写了一个求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;
}
展开全部
#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; /*将值返回*/
}
#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; /*将值返回*/
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#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");
};
}
这是读书的时候建立的行列式求值,效率并不高;方法就是以代数余子式的方法嵌套得出来的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询