# include <stdio.h> # include <malloc.h> struct t_Factorial { short n, // величина факториала n! N ; // число сочетаний char *value ; // массив, в котором лежат сочетания long n_value ; short fak[10] ; // число сочетаний от i // ------ величины, нужные при построении ------- long j ; short I[10] ; // значения бегучих индексов short flag[10]; // занятые индексы t_Factorial( short nn ); long calc_factorial( short _n ); void make( short z ); long use( long Variant, long Word ); }; /************************************************************************/ long t_Factorial :: calc_factorial( short nn ) { long i,NN ; for( NN=i=1 ; i<=nn ; i++ ) { NN*=i ; fak[i]=NN ; } return NN ; } /************************************************************************/ void t_Factorial :: make( short z ) { long i,z1 ; if( z<0 ) { j++ ; z1=n*(N-j) ; for( i=0 ; i<n ; i++ ) value[z1+i]=I[i] ; return ; } for( I[z]=0 ; I[z]<n ; I[z]++ ) { if( flag[I[z]]==0 ) { flag[I[z]]=1 ; make( z-1 ); flag[I[z]]=0 ; } } } /************************************************************************/ t_Factorial :: t_Factorial( short _n ) { short i,i1 ; for( i=0 ; i<10 ; i++ ) I[i]=flag[i]=0 ; n=_n ; N=calc_factorial( n ); n_value=n*N ; value=(char *)calloc( n_value,sizeof(char) ); j=0 ; make( n-1 ); /* for( i=0 ; i<N ; i++ ) { printf("\n"); for( i1=0 ; i1<n ; i1++ ) printf( "%d",value[i*n+i1] ); } */ } /************************************************************************/ long t_Factorial :: use( long Variant, long Word ) { return value[Variant*n+Word] ; }