9阶因内行列式的运算

#工作期间闲来没事写的。

#目标是做加密用的。还没写完。

#第一步是求序列的全排列和逆序数(完)

#第二步是求行列式的值。(完)

#第三歩加密(待续)

#第四步解方程组(待续)

#第五步解密(待续)

#include <stdio.h>

#include <stdlib.h>
#include <math.h>

char strtem[254] = {'\0',};

typedef struct fenshu
{
    int fenzi;
    int fenmu;
}fenshu;


int  init_D(int row,int col)
{
    int j=0,i = 0;


    fenshu **D =  calloc(sizeof(fenshu *),row);
    for(i=0;i<row;i++)
    {
        *(D+i) = calloc(sizeof(fenshu),col);
        for(j=0;j<col;j++)
        {
            (*(*(D+i)+j)).fenmu = 1;
            (*(*(D+i)+j)).fenzi = 1;
        }
    }


    (*(*(D+0)+0)).fenzi = 3;
    (*(*(D+1)+1)).fenzi = 3;
    (*(*(D+2)+2)).fenzi = 3;
    (*(*(D+3)+3)).fenzi = 3;


//    (*(*(D+0)+0)).fenzi = 3;(*(*(D+0)+1)).fenzi = 1;(*(*(D+0)+2)).fenzi = -1;(*(*(D+0)+3)).fenzi = 2;
//    (*(*(D+1)+0)).fenzi = -5;(*(*(D+1)+1)).fenzi = 1;(*(*(D+1)+2)).fenzi = 3;(*(*(D+1)+3)).fenzi = -4;
//    (*(*(D+2)+0)).fenzi = 2;(*(*(D+2)+1)).fenzi = 0;(*(*(D+2)+2)).fenzi = 1;(*(*(D+2)+3)).fenzi = -1;
//    (*(*(D+3)+0)).fenzi = 1;(*(*(D+3)+1)).fenzi = -5;(*(*(D+3)+2)).fenzi = 3;(*(*(D+3)+3)).fenzi = -3;


//    (*(*(D+0)+0)).fenzi = 1;(*(*(D+0)+1)).fenzi = 2;(*(*(D+0)+2)).fenzi = -4;
//    (*(*(D+1)+0)).fenzi = -2;(*(*(D+1)+1)).fenzi = 2;(*(*(D+1)+2)).fenzi = 1;
//    (*(*(D+2)+0)).fenzi = -3;(*(*(D+2)+1)).fenzi = 4;(*(*(D+2)+2)).fenzi = -2;


//    (*(*(D+0)+0)).fenzi = 3;(*(*(D+0)+1)).fenzi = -2;
//    (*(*(D+1)+0)).fenzi = 2;(*(*(D+1)+1)).fenzi = 1;


    return D;
}


void free_D(fenshu **D,int row,int col)
{
    int i =0;


    if(D)
    {
        for(i=0;i<row;i++)
        {
            free(D+i);
        }
        free(D);
    }


    return ;
}


void print_D(fenshu **D1,int row,int col)
{
    int i=0,j=0;
    printf("+++++++++++++++++++++++++方阵是+++++++++++++++++++++++++\n");
    printf("%d行%d列\n",row,col);
    for(i=0;i<row;i++)
    {
        printf("\n");
        for(j=0;j<col;j++)
        {


            if((*(*(D1+i)+j)).fenmu == 1)
            {


                printf("%d ",(*(*(D1+i)+j)).fenzi);
            }
            else
            {
                printf("%d/%d ",(*(*(D1+i)+j)).fenzi,(*(*(D1+i)+j)).fenmu);
            }


        }
    }
    printf("\n");
    printf("++++++++++++++++++++++++++++++++++++++++++++++++++\n");
    return;
}


//num < 9
void get_temstr(int num)
{
    int i = 0;
    for(i=0;i<num;i++){
        itoa(i,&strtem[i],10);
    }
    strtem[i] = '\0';
    return ;
}


int lenof_P(int num)
{
    int sizep = 1;
    int i = 0;


    for(i = num;i>0;i--)
    {
        sizep*=i;
    }
    return sizep;
}


void pailie(char **P,int *nownum,const int num,char *tem,int now)
{
    int i = 0,j=0;


    if((*nownum)>lenof_P(num))
    {
        return ;
    }


    if(num==now)
    {
        //printf("---nownum=%d\n",*nownum);
        for(i=0;i<num;i++)
        {
            *(P+*nownum*num+i) = *(tem+i);
        }
        *nownum = *nownum + 1;
        return;
    }


    for(i=0;i<num;i++)
    {
        int in_flag = 0;
        for(j=0;j<now;j++)
        {
            if((*(strtem+i))==(*(tem+j)))
            {
                in_flag = 1;
                break;
            }
        }
        if(!in_flag)
        {
            *(tem+now) = *(strtem+i);
            pailie(P,nownum,num,tem,now+1);
        }
    }
    return;
}


char ** quanpailie_P(int num)
{
    int sizep = 1;
    int i = 0,j=0;
    char **P;
    int nownum = 0;
    char tem[256] = {'t',};


    get_temstr(num);
    sizep = lenof_P(num);


    P = calloc(sizeof(int *),sizep);
    for(i=0;i<sizep;i++)
    {
        *(P+i) = calloc(sizeof(int),num);
    }


    for(i=0;i<sizep;i++)
    {
        for(j=0;j<num;j++)
        {
            *(P+i*num+j) = 'a';
        }
    }
    pailie(P,&nownum,num,tem,0);


    return P;
}


void print_P(char **P,int num)
{
    int sizep = lenof_P(num);
    int i=0,j=0;
    printf("+++++++++++++++++++++++++全排列+++++++++++++++++++++++++\n");
    printf("一共%d个排列\n",sizep);
    for(i=0;i<sizep;i++)
    {
        printf("\n");
        for(j=0;j<num;j++)
        {
            printf("%d ",*(P+i*num+j)-48);
        }
    }
    printf("\n");
    printf("++++++++++++++++++++++++++++++++++++++++++++++++++\n");
}


int value_t(char **P,int row,int num)
{
    int t = 0;
    int i =0 ,j = 0;


    for(i=0;i<num;i++)
    {
        for(j=i-1;j>=0;j--)
        {
            if(*(P+num*row+i)<*(P+num*row+j))
            {
                t++;
            }
        }
    }
    return t;
}




double value_D(fenshu **D,int row)
{
    int i=0,j=0;


    int t = 0;
    double sum =0,mul = 1;


    char **P = quanpailie_P(row);
    print_P(P,row);
    for(i=0;i<lenof_P(row);i++)
    {
        printf("-->");
        for(j=0;j<row;j++)
        {
            printf("%c,",*(P+row*i+j));
        }
        printf("的逆序数是:%d\n",value_t(P,i,row));
    }


    for(j=0;j<lenof_P(row);j++)
    {
        t = value_t(P,j,row);mul = 1;
        for(i=0;i<row;i++)
        {
            int tt = *(P+j*row+i)-48;
            printf("%d*",D[i][tt].fenzi/D[i][tt].fenmu);
            mul = mul*D[i][tt].fenzi/D[i][tt].fenmu;
        }
        printf("-1**%d",t);
        mul = pow(-1,t)*mul;
        sum = sum + mul;
        printf(" =%0.2f\n",mul);
    }


    return sum;
}






int main()
{
//    char **P = quanpailie_P(5);
 //   print_P(P,5);


    fenshu **D;
//    D = init_D(4,4);
//    print_D(D,4,4);
//    printf("value_D=[%0.2f]",value_D(D,4));
//    free_D(D,4,4);


    D = init_D(4,4);
    print_D(D,4,4);
    printf("value_D=[%0.2f]",value_D(D,4));
    printf("\n");
    printf("\n");
    free_D(D,4,4);


 //   D = init_D(3,3);
 //   print_D(D,3,3);
  //  printf("value_D=[%0.2f]",value_D(D,3));
  //  free_D(D,3,3);


    //D = init_D(2,2);
    //print_D(D,2,2);
    //printf("value_D=[%0.2f]",value_D(D,2));
    //free_D(D,2,2);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值