寻找行列不起作用的程序

时间:2017-04-28 11:14:37

标签: c matrix

所以我正在尝试编写一个程序来查找n * n矩阵的行列式。这就是我写的:

int a[10][10],b[10][10],o;
main()
{
    int i,j;
    printf("Enter Order: ");scanf("%d",&o);
    printf("Enter Matrix:\n");
    for(i=1;i<=o;i++)
    {
        for(j=1;j<=o;j++)
            scanf("%d",&a[i][j]);
    }
    printf("The determinant is %d",det(a,o));
    printf("\n");
}
int det(int t[10][10],int ord)
{
    int d=0,i,j;
    if(ord==2)
    {
        d=(t[1][1]*t[2][2])-(t[2][1]*t[1][2]);
    }
    else if(ord>2)
    {
        for(i=1;i<=ord;i++)
        {
            d=d+(t[1][i]*cofac(t,ord,1,i))
        }
    }

    return d;
}
int cofac(int t[10][10],int ord,int row,int col)
{
    int i=1,j=0,x,y;
    for(x=1;x<=ord;x++)
    {
        for(y=1;y<=ord;y++)
        {
            if(x!=row && y!=col)
            {
                j++;
                b[i][j]=a[x][y];
            }
        }
        if(j==ord-1)
        {
            i++;j=0;
        }
    }
    return((pow(-1,row+col))*det(b,ord-1));
}

现在出于某种原因,这适用于3 * 3矩阵,但对高阶矩阵给出了错误的答案。有人可以向我解释原因吗?我一直试图解决这个问题好几个小时,但却无法理解发生了什么。

1 个答案:

答案 0 :(得分:0)

通过将行列式和辅因子函数组合成一个来解决问题。这是解决方案:

#include<stdio.h>
double det(float[10][10],int);
void main()
{
    int i,j,n;
    float a[10][10];
    printf("Enter order: ");
    scanf("%d",&n);
    if(n<=0)
    {
        printf("Please enter a positive value for order");
        goto end;
    }
    printf("Enter matrix:\n");
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            scanf("%f",&a[i][j]);
        }
    }
    printf("The determinant is %f", det(a,n));
    end:;
}
double det(float m[10][10],int ord)
{
    int f=0,g=0,x,y,i,j,p=1;
    float t[10][10];
    double d=0;
    if(ord==1)
        d=m[0][0];
    else if(ord==2)
        d=(m[0][0]*m[1][1]-m[1][0]*m[0][1]);
    else if(ord>2)
    {
        for(x=0;x<ord;x++)
        {
            f=0;g=0;
            for(i=0;i<ord;i++)
            {
                for(j=0;j<ord;j++)
                {
                    if(i!=0 && j!=x)
                    {
                        t[f][g]=m[i][j];g++;
                    }
                }
                if(g==ord-1)
                {
                    g=0;f++;
                }
            }
            d=d+m[0][x]*p*det(t,ord-1);
            p=-1*p;
        }
    }
    return d;
}