Lógica de Programação

22 respostas
C

Pessoal,

Estou precisnado fazer combinações entre alguns números do tipo:
conjunto de números : 1,2,3,4,5
teria que gerar todas as combinações em grupos de 3, até ai ótimo só fazer 3 “for” um dentro do outro e está resolvido, só que tenho dois problemas o conjunto de números e o números de dezenas no grupo podem variar.

exemplo:
conjunto: 1,2,3,4,5
grupos de 3 dezenas

conjunto: 3,4,5,7,14,15
grupos de 4 dezenas

alguém poderia me ajudar com uma lógica para resolver o problema.

22 Respostas

AlissonSchneider

cara dexa eu ver se eu entendi

vc tem os grupos

A e B por exemplo

ai vc tem números de 3 dezenas e quer fazer combinações entre eles só que tem número que tem mais dezenas que outros

Exemplo

A B
1 1
2 2
3 3
23

Combinação A = 123, 321, 212, 312
Combinação B = 123, 321, 212, 312, ???

Seria mais ou menos isso

abrass

:wink:

C

Assim ó:
eu tenho um universo de dezenas que vai de 1 a 10 por exemplo.
ai eu tenho que em determinado momento combinar essas dezenas em grupos de 3
exemplo: 1,2,3 - 1,2,4 - 1,2,5 - 1,2,6 - 1,2,7 … 3,4,5 … etc etc …

ai em outro determinado momento eu tenho que combinar essas dezenas em grupo de 5
exemplo: 1,2,3,4,5 - 1,2,3,4,6 - 1,2,3,4,7 … etc etc

entendeu?

AlissonSchneider

Entendi sim cara

E a o que vai definir se vai ser em 3 ou em 5 vai ser uma condição que o usuário vai especificar?

C

exatamente, o usuário dirá como ele quer combinar isso

AlissonSchneider

Só mais uma coisa você conseguiu fazer em 3 de boa né

flw

abras

:wink:

C

sim, quero combinar isso de forma dinamica

AlissonSchneider

Posta o código ai pra ver se eu consigo te dar uma mão

flw

abrass

C
public void gerar(){
		for(int a=1;a<8;a++){
			for(int b=2;b<9;b++){
				for(int c=3;c<10;c++){
					System.out.println(a+","+b+","+c);
				}
			}
		}
	}
regis_hideki

caravelas:
public void gerar(){ for(int a=1;a<8;a++){ for(int b=2;b<9;b++){ for(int c=3;c<10;c++){ System.out.println(a+","+b+","+c); } } } }

Nesse caso você quis conjuntos de 3 elementos com os caracteres de 1 a 9? Se for, enxerguei um erro: o mesmo caractere não pode aparecer duas vezes no conjunto.

C

Tanto faz aparecer ou não, o meu problema não é combinar grupos fixos, pois para isso eu faço “for” como fiz, o problema e fazer uma combinação com grupos de qtdes diferentes como explicitado anteriormente…

C

Eu estou tentando fazer um método recursivo mas não estou obtendo exito.

C

E ai pessoal nada?

pmlm

Vê o algoritmo que fiz neste topic. Só tens de adaptar para não fazer as combinações todas e para ao fim de n níveis.

C

pmlm gostei da sua solução, mas queria que a coisa fosse mais dinâmica queria chamar um método mais ou menos assim gerarCombinacoes(a,b,y) onde a seria o número inicial a ser gerado, b seria o número final e y a qtde de numeros do grupo
exemplo:

gerarCombinacoes(1,5,3) a saída seria:
1,2,3
1,2,4
1,2,5
1,3,4
1,3,5
1,4,5
2,3,4
2,3,5
etc, etc

C

E ai pessoal vamos tentar resolver essa

pmlm

Mas o que queres aqui é diferente do que queres no posto inicial. De qualquer forma já tens ali a base do algoritmo, podes tentar alterar sem esperar que alguém faça tudo para ti.

C

pmlm longe de mim querer que alguém me entregue algo pronto, postei essa dúvida para que possamos discutir uma melhor forma de fazer isso, o que você postou ajuda sim, mas não acredito ser a melhor solução principalmente no quesito performance.

mas valeu por tentar ajudar e espero continuarmos a trocar idéia para resolver isso.

C

UP!

R

eu não sei se entendi direito mas veja se eh isso mesmo...

int X = número de elementos no grupo, especificado pelo usuario
int Z = numero de grupos que vao ser gerados
int contador = 0

while ( contador < Z ) {

X = usuario escolhe um numero de elementos no grupo 

      for ( int i = 0, i < X; i ++ ) {
     
              System.out.print( Math.random()*10 + "," );
      }

      System.out.println("");

contador++;
}

podia usar 2 for, mas assim da pra vc entender melhor a idéia =p
como vc nao diz em q momento ele escolhe o numero de elementos, eu calculei q era na geração de cada grupo mas dae vc q sabe... pode criar uma constante definindo o numero de vezes que serão sorteados cada vez que ele escolher um numero de elementos no grupo sei la ( nesse caso o X teria que sair do while )... vai do q vc quiser

C

Boa noite redr4gon o que você propôs seria válido para trabalhar com números randomicos, mas o que eu preciso é combinar grupos de números pré definidos como dito anteriormente.

pmlm

Feito assim no joelho:

public class Teste{

    public static void main(String args[]) {
        String seq = "12345";
        int maxLevel = 3;

        new Teste().proccess(new StringBuilder(seq), maxLevel);

    }

    private void proccess(StringBuilder sequencia, int maxLevel) {
        for (int i = 0; i < sequencia.length(); i++) {
            add(new StringBuilder(), sequencia.charAt(i), removeChar(sequencia, i), 1,maxLevel);
        }
    }

    private void add(StringBuilder seq, char c, StringBuilder remain, int level, int maxLevel) {
        StringBuilder newSeq = new StringBuilder(seq.length() + 1);
        newSeq.append(seq);
        newSeq.append(c);

        if (remain.length() == 0 || level == maxLevel) {
            System.out.println(newSeq);
        } else {
            for (int i = 0; i < remain.length(); i++) {
                add(newSeq, remain.charAt(i), removeChar(remain, i), level+1, maxLevel);
            }
        }

    }

    private StringBuilder removeChar(StringBuilder c, int pos) {
        StringBuilder result = new StringBuilder(c.length() - 1);
        result.append(c);
        result.deleteCharAt(pos);

        return result;
    }

}
C

pmlm acho que essa solução ficou massa

Criado 14 de janeiro de 2011
Ultima resposta 18 de jan. de 2011
Respostas 22
Participantes 5