Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * [combr2.c]
- * Programa que gera combinações de tamanho r de
- * números em um vetor fixo.
- *
- * [Uso]
- * $ gcc -o combr2 combr2.c
- * $ ./combr2
- * 3 <-- digite o r
- *
- * Fri Oct 9 08:13:23 BRT 2015
- */
- #include <stdio.h>
- #include <string.h>
- /* Tamanho máximo da entrada */
- #define MAX_INPUT 31
- int main() {
- unsigned MAX, MASK, NUM ;
- int i, j, r, k ;
- /* Coloque aqui seus números. MAXIMO=31 numeros. */
- int input[]={
- 6, 14, 22, 4, 77, 99, 6, 33,
- 11, 34, 56, 78, 90,
- NULL};
- int str[MAX_INPUT] ;
- int l = 0;
- for(i=0; input[i]!=NULL;i++) l++;
- printf("Digite o r: ") ;
- scanf("%d", &r) ;
- /* Manda o bit 1 para a n-ésima posição.
- * Os bits são invertidos para que a posição n
- * esteja com o bit zero, a fim de marcar
- * o final do processo.
- */
- MAX = ~(1 << l) ;
- /* Primeiro número é o 1. */
- NUM = 1;
- putchar('\n') ;
- /* Quando o número alcançar MAX, o loop
- * será encerrado.
- */
- while ( MAX & NUM ) {
- /* Conta os bits 1's. */
- MASK = 1 ;
- k = 0 ;
- while ( MAX & MASK ) {
- if ( NUM & MASK ) k++ ;
- MASK = MASK << 1 ;
- }
- /* Monta o resultado somente se
- * a quantidade de bits k é igual
- * a r. */
- if ( k == r ) {
- MASK = 1 ;
- i = j = 0 ;
- while ( MAX & MASK ) {
- /* Verdadeiro se NUM tem um bit 1
- * na posição indicada por MASK. */
- if ( NUM & MASK ) {
- /* Gera a combinação em str */
- str[i] = input[j] ;
- i++ ;
- }
- j++ ;
- /* Desloca a máscara */
- MASK = MASK << 1 ;
- }
- /* As combinações estão no vetor[]. Aqui mostramos cada
- * elemento como número */
- for(l=0;l<i;l++)printf("%d ", str[l]); putchar('\n') ;
- }
- NUM++ ;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement