Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Program demonstrativ: calcul numar de ordine pe baza unei permutari
- #include <stdio.h>
- char nr[10], folosit[10], perm[10];
- int main() {
- int b, n, k, kc, u, i, cf;
- scanf( "%d", &n ); // n cifre in baza factorial
- u = 1;
- // calculam ultimul numar de ordine (strict mai mare)
- for ( b = 2; b <= n; b++ )
- u *= b;
- k = kc = 0;
- while ( k < u ) {
- // construim numarul nr[] in baza factorial
- kc = k;
- for ( b = 1; b <= n; b++ ) {
- nr[b - 1] = kc % b;
- kc /= b;
- }
- // afisam numarul nr[] in baza factorial
- printf( "%4d: ", k );
- for ( b = n; b > 0; b-- )
- fputc( '0' + nr[b - 1], stdout );
- // resetam vectorul de elemente folosite
- for ( b = n - 1; b >= 0; b-- )
- folosit[b] = 0;
- // generam permutarea
- fputc( ' ', stdout );
- for ( b = n - 1; b >= 0; b-- ) { // parcurgem cifrele nr. in baza factorial
- i = -1;
- while ( nr[b]-- >= 0 ) // sarim peste nr[b]+1 elemente nefolosite
- do
- i++;
- while ( folosit[i] );
- folosit[i] = 1; // marcam elementul ca folosit
- fputc( '1' + i, stdout ); // si il afisam
- perm[b] = i; // stocam elementul in permutare
- }
- // resetam vectorul de elemente folosite
- for ( b = n - 1; b >= 0; b-- )
- folosit[b] = 0;
- // calculam numarul de ordine al permutarii curente
- kc = 0;
- for ( b = n - 1; b >= 0; b-- ) { // parcurgem elementele permutarii
- cf = 0;
- for ( i = perm[b] - 1; i >= 0; i-- ) // pornim in 'folosit[]' in jos
- cf += (1 - folosit[i]); // cautam cifre nefolosite
- folosit[perm[b]] = 1; // marcam elementul ca folosit
- kc = kc * (b + 1) + cf; // adaugam cifra curenta la numarul de ordine
- }
- printf( " %4d\n", kc ); // afisam numarul de ordine
- k++;
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment