#工作期间闲来没事写的。
#目标是做加密用的。还没写完。
#第一步是求序列的全排列和逆序数(完)
#第二步是求行列式的值。(完)
#第三歩加密(待续)
#第四步解方程组(待续)
#第五步解密(待续)
#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);
}