Alex_tz307

Operatii pe permutari in baza factoriala

Sep 14th, 2020
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.89 KB | None | 0 0
  1. // Program demonstrativ: calcul numar de ordine pe baza unei permutari
  2. #include <stdio.h>
  3.  
  4. char nr[10], folosit[10], perm[10];
  5.  
  6. int main() {
  7.   int b, n, k, kc, u, i, cf;
  8.  
  9.   scanf( "%d", &n ); // n cifre in baza factorial
  10.   u = 1;
  11.   // calculam ultimul numar de ordine (strict mai mare)
  12.   for ( b = 2; b <= n; b++ )
  13.     u *= b;
  14.  
  15.   k = kc = 0;
  16.   while ( k < u ) {
  17.     // construim numarul nr[] in baza factorial
  18.     kc = k;
  19.     for ( b = 1; b <= n; b++ ) {
  20.       nr[b - 1] = kc % b;
  21.       kc /= b;
  22.     }
  23.  
  24.     // afisam numarul nr[] in baza factorial
  25.     printf( "%4d: ", k );
  26.     for ( b = n; b > 0; b-- )
  27.       fputc( '0' + nr[b - 1], stdout );
  28.  
  29.     // resetam vectorul de elemente folosite
  30.     for ( b = n - 1; b >= 0; b-- )
  31.       folosit[b] = 0;
  32.  
  33.     // generam permutarea
  34.     fputc( ' ', stdout );
  35.     for ( b = n - 1; b >= 0; b-- ) { // parcurgem cifrele nr. in baza factorial
  36.       i = -1;
  37.       while ( nr[b]-- >= 0 )         // sarim peste nr[b]+1 elemente nefolosite
  38.         do
  39.           i++;
  40.         while ( folosit[i] );
  41.       folosit[i] = 1;                // marcam elementul ca folosit
  42.       fputc( '1' + i, stdout );      // si il afisam
  43.       perm[b] = i;                   // stocam elementul in permutare
  44.     }
  45.  
  46.     // resetam vectorul de elemente folosite
  47.     for ( b = n - 1; b >= 0; b-- )
  48.       folosit[b] = 0;
  49.    
  50.     // calculam numarul de ordine al permutarii curente
  51.     kc = 0;
  52.     for ( b = n - 1; b >= 0; b-- ) { // parcurgem elementele permutarii
  53.       cf = 0;
  54.       for ( i = perm[b] - 1; i >= 0; i-- ) // pornim in 'folosit[]' in jos
  55.         cf += (1 - folosit[i]);            // cautam cifre nefolosite
  56.       folosit[perm[b]] = 1;                // marcam elementul ca folosit
  57.       kc = kc * (b + 1) + cf; // adaugam cifra curenta la numarul de ordine
  58.     }
  59.  
  60.     printf( " %4d\n", kc );   // afisam numarul de ordine
  61.  
  62.     k++;
  63.   }
  64.   return 0;
  65. }
Add Comment
Please, Sign In to add comment