sobre numero possibilidade

1. sobre numero possibilidade

Orlando Oliveira Berssane
nandomaximo

(usa Debian)

Enviado em 24/08/2015 - 10:25h

bom estou programando , estou meio com problemas , se alguém pode me ajudar ai agradeço muito , bom vou explica o problema .

estou programando em c para fazer numero de possibilidade .
ex:..

eu escolho ter 4 numero
e depois escolho ter 3 numero para possibilidade

ele vai imprimir:
1,2,3
1,2,4
1,3,4
2,3,4

numero de possibilidade em ordem crescente

da um olhada, se ajuda .

#include <stdio.h>
#include <string.h>

/* Tamanho máximo da entrada */
#define MAX_INPUT 31
#define TAMANHO 1000

int main() {
unsigned MAX, MASK, NUM ;
int i, j, r, k,cta,aux ;
int nvetor[100];
cta = 0;
/* Armazena a string de entrada. */
char input[MAX_INPUT] ;
/* Armazena cada combinação. */
char str[MAX_INPUT] ;

printf("Digite o grupo inicial: ") ;
scanf("%s", input) ;

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 << strlen(input)) ;

/* 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 ;
}

str[i]=0 ;
/*printf("%s\n", str) ;*/
nvetor[cta] = str; //aqui salvo os valores em um vetor para depois ordenar e mostrar
printf("= %s\n", nvetor[cta]) ;
cta++; // cta guarda a quantidade de elementos q foi gerado

}

NUM++ ;
}
//implementar um método de ordenação e mostrar os valores


return 0;
}





  


2. Re: sobre numero possibilidade

Paulo
paulo1205

(usa Ubuntu)

Enviado em 24/08/2015 - 16:26h

Eu não entendi a relação entre o que você disse que quer fazer (i.e. um programa para exibir as sequências de combinações) e o código fonte que você postou (que faz uma estranha manipulação de bits da qual eu não consegui extrair sentido).

Para fazer o que você pediu, trabalhe com uma pilha (pode ser implementada como array) em cujo topo vai ficar o último número usado na sequência, e dois loops que escolhem o valor do próximo elemento ou modificam a pilha em função do seu tamanho atual e do valor atual no seu topo.


3. Re: sobre numero possibilidade

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 25/08/2015 - 10:13h

Bom dia.

Como o @paulo1205 disse, não entendi muito bem o que você quer. Acho que é algo similar a análise combinatória/permutações.
Tem um código meu aqui no VOL que gera os anagramas de uma lista de tokens.
Dá uma olhada, talvez você tire alguma idéia e modifique para seu propósito.


/* anagram.c
*
* Enzo Ferber : <enzoferber@gmail.com>
* Abri de 2015
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *global_str;
double anagram_count;

void anagram_builder (char *str, int n, int pos)
{
register int i;
char backup;

for ( i = 0; i < n; i++) {
global_str[pos] = str[i];

backup = str[0];
str[0] = str[i];
str[i] = backup;

anagram_builder (str + 1, n - 1, pos + 1);

str[i] = str[0];
str[0] = backup;

}

if ( n == 1 ) {
printf ("%s\n", global_str);
anagram_count++;
}
}

void anagram (char *str)
{
int l = strlen(str);

// memory
global_str = (char *)malloc(l * sizeof(char));

if (!global_str) {
perror("malloc");
exit (EXIT_FAILURE);
}

// anagram count
anagram_count = 0;

// zero out string
memset (global_str, 0x0, l );

// anagrams!
anagram_builder (str, l, 0);

// inform the user
printf("\n-\n");
printf("Anagrams: %.0lf\n", anagram_count);

// free
free (global_str);
}

int main (int argc, char *argv[])
{
if (argc > 1)
anagram (argv[1]);
else
printf("Usage: Anagram [token_list]\n");

return 0;
}


LINK: http://www.vivaolinux.com.br/script/Anagramas/
Se for fazer o Download, pegue a versão 2.
A versão 1 é bem ruim...

Enzo Ferber
[]'s

P.S.: Quando for postar códigos no VOL, utilize as tags [ code] e [ /code] (sem os espaços), assim fica melhor de visualizar. Outra dica interessante é indentar seu código. Fica bem melhor para ler...


$ cat codigo.c | indent -kr -i8
$ man indent

"(...)all right-thinking people know that (a) K&R are _right_ and (b) K&R are right." - linux/Documentation/CodingStyle - TORVALDS, Linus.



4. Re: sobre numero possibilidade

Fernando
phoemur

(usa Debian)

Enviado em 10/09/2015 - 23:23h

Quando eu vejo esse tipo de coisa eu sempre sou lembrado do quanto eu gosto de python:

#!/usr/bin/env python

from itertools import combinations
print list(combinations([1,2,3,4], 3))


E está resolvido o problema em 2 linhas. Pode até ser menos eficiente, porém eu prefiro otimizar o meu tempo programando do que o tempo da máquina...rs Coisa de vagabundo mesmo...
Cada ferramenta com sua aplicação específica.



5. Re: sobre numero possibilidade

Perfil removido
removido

(usa Nenhuma)

Enviado em 11/09/2015 - 00:47h

phoemur escreveu:

Quando eu vejo esse tipo de coisa eu sempre sou lembrado do quanto eu gosto de python:

#!/usr/bin/env python

from itertools import combinations
print list(combinations([1,2,3,4], 3))


E está resolvido o problema em 2 linhas. Pode até ser menos eficiente, porém eu prefiro otimizar o meu tempo programando do que o tempo da máquina...rs Coisa de vagabundo mesmo...
Cada ferramenta com sua aplicação específica.


É por isso que eu considero frustrante aprender Python.
Mas cada um é cada um...

Não há coisa alguma errada com a linguagem, pelo contrário.
Mas que tira a graça, isso tira.

--
http://s.glbimg.com/po/tt/f/original/2011/10/20/a97264_w8.jpg

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden


6. Re: sobre numero possibilidade

Perfil removido
removido

(usa Nenhuma)

Enviado em 11/09/2015 - 00:57h

Eu sei o que ele quer fazer e em parte é o problema de como expressar coeficientes de um polinômio através de suas raízes.

Por exemplo a*x^4+b*x^3+c*x^2+d*x+e=0

Expressando, por exemplo d que é o terceiro coeficiente, através da forma -d/a fica

-d/a = x_1*x_2*x_3 + x_1*x_2*x_4 + x_1*x_3*x_4 + x_2*x_3*x_4

Como é o terceiro na lista pega-se as raízes de 3 em 3 num conjunto de 4.

Vejam que é apenas a forma de expressar coeficientes, não é a resolução da equação. Senão faltaria fórum prá montar as fórmulas.

Agora quanto ao problema do algoritmo, eu tentei fazer interativo dia destes e consegui, mas a solução é grande demais para ser colocada à margem desta postagem.

Falando sério, não sei em que disco está por aqui no caos. Usa-se um conjunto de loops for aninhados, três ou quatro. É do que me lembro e é trabalhoso.

--
http://s.glbimg.com/po/tt/f/original/2011/10/20/a97264_w8.jpg

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden


7. Re: sobre numero possibilidade

Paulo
paulo1205

(usa Ubuntu)

Enviado em 11/09/2015 - 12:27h

phoemur escreveu:

Quando eu vejo esse tipo de coisa eu sempre sou lembrado do quanto eu gosto de python:

#!/usr/bin/env python

from itertools import combinations
print list(combinations([1,2,3,4], 3))


E está resolvido o problema em 2 linhas. Pode até ser menos eficiente, porém eu prefiro otimizar o meu tempo programando do que o tempo da máquina...rs Coisa de vagabundo mesmo...
Cada ferramenta com sua aplicação específica.


Parece-me que a ideia do exercício é ensinar a implementar, não usar uma implementação pronta.

Acho que ninguém em sã consciência é contra o reuso do que já existe nem contra a escolha da ferramenta mais adequada para resolver os problemas, desde que respeitadas as devidas restrições.

Pense no seguinte cenário: você tem de implementar o exercício pedido num Arduino, exibindo a saída numa tela de cristal líquido com 16 colunas e duas linhas. Duvido que haja um interpretador Python nessa plataforma, e mais ainda que se implemente uma parte da biblioteca tão “supérflua” como essa que você mostrou.

Aprender a trabalhar só com o básico tem um grande valor didático. Até porque existem situações reais em que você só pode mesmo contar com o básico.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts