Iny[][] Preciso obter bla..bla

Seguinte galera tava estudando agora e me surgiu um problema, de facil resolucao, e que me chamou a atencao eis ai ele:

Considere todas as trinta e duas seqüências, com cinco elementos cada uma, que podem ser formadas com os algarismos 0 e 1. Quantas dessas seqüências possuem pelo menos três zeros em posições consecultivas?

É claro que são 32 sequencias, pois o numero de caracteres disponiveis sao 2 e o numero de elementos sao 5, logo 2 ^ 5 = 32
E o numero de sequancias que tem o (…0,0,0…) sao 8:
00000
00001
00011
10000
11000
10001
01000
00010

A resposta ja achamos, agora eu queria obter uma matriz [x][y] com todos os elementos da lista, eu fiz um codigo que ficou +ou- assim: (nada real, apenas uma representação)

for(l1 = 0;l1 < 2;l1++)
for(l2 = 0;l2 < 2;l2++)
for(l3 = 0;l3 < 2;l3++)
for(l4 = 0;l4 < 2;l4++)
for(l5 = 0;l5 < 2;l5++)
{
arr[count] = {l1,l2,l3,l4,l5};
count++;
}
mostra( arr.metodo("
") )

Mas eu to achando essa solucao um tanto quanto ruim, alguem teria sugestoes??

Obrigado

na minha opinião essa é uma forma genérica bastante simples, não vejo motivos para não usa-lá, vc poderia iniciar direto com as valores, tipo

int[][] array= {
   {0,0,0,0,0},
   {0,0,0,0,1},
   ...
   };

mas ai se vc for fazer alguma alteração vai ter q fazer na raça, por exemplo, se quiser sequencias com 6 dígitos vai fazer tudo d novo.
Do seu modo basta adicionar + 1 laço.

Deve haver um modo de ficar sem adicionar +1 laço e fazer tudo automaticamente. Vamos lá preciso de mentes pensantes!

Me diga pq vc não gostou dessa solução?
Oq o incomoda nela?

(Código atualizado)

Rapaz, deu trabalho, mas a vontade de postar é tanta! :smiley:

[code]public class Binarios {

   char[][] iny;
   int tam;

   public Binarios(int tam){
           this.tam = tam;
           iny = new char[(int)Math.pow(2,tam)][tam];
           magica();
           impressao();
    }


    public void magica(){

           int a = 0;
           StringBuffer aux;

           for(int i=0; i<Math.pow(2,tam); i++){
                   aux = new StringBuffer(Integer.toBinaryString(a++));
                   for(;aux.length()<tam;)
                        aux.insert(0,"0");//insere valores "0" na esquerda

                   for(int j=0; j<tam;j++)
                           iny[i][j] = aux.charAt(j);//grava no iny

           }

    }

    public void impressao(){

           for(int j=0; j<Math.pow(2,tam);j++){
                   for(int i=0; i<tam; i++)
                           System.out.print(iny[j][i]);
                   System.out.println();
           }

    }



    public static void main(String args[]){

           Binarios bin = new Binarios(5);
    }

}[/code]

:lol: ÊÊÊÊÊ

Fiz com uma matriz (iny) de char, mas é fácil converter para o q vc estiver querendo.

:arrow: Caso queira eu explico melhor o código.

Espero q tenha ajudado.

Pronto!

Só faltava um truque… 8)

[code]public void impressao(){

           for(int j=0; j<Math.pow(2,tam);j++){
                   for(int i=0; i<tam; i++)
                           System.out.print(vetor[j][i]);
                   System.out.println();
           }

    }[/code]

Tem um probleminha: byte a = 0; :frowning:
coloque int a = 0; :slight_smile:

Me explica melhor, eu até entendi algumas partes, mas ainda nao estudei o suficiente pra chegar nessa solução.
Porque quando voce declara a matriz de ‘chars’ vc converte em int o resultado de Math.pow(2, tam) ? Ele retorna um double por acaso?

O metodo Magica foi o que mais me gerou duvidas, não conheço muito bem a classe StringBuffer e o método insert. Mas pelo visto ele acrescenta algo na String prq senão seu loop for ficaria infinito, correto? Agora como ele funciona?

Por acaso para eu saber o tamanho de uma String eu não uso uma propriedade né? e sim um MÉTODO! Isso me confundiu, prq na maioria das linguagens eu uso PROPRIEDADES para saber o tamanho total da string. O charAt eu jah conhecia.

Agora porque usar o Integer.toBinaryString com a var ‘a’ do tipo int em que você acresenta a toda vez que o loop do contador ‘i’ roda? Que lógica tem por trás desses número binários?

Então não seria mais fácil fazer assim se fosse uma squencia:

for(int i = 0;i < 5000;i++) {
 int[z][y] = Integer.toBinaryString(i);
}

Brigadão ae cara!

Oba! Pensei q não ia responder…
Caso não entenda minha explicação é só postar.

[quote]Porque quando voce declara a matriz de ‘chars’ vc converte em int o resultado de Math.pow(2, tam) ? Ele retorna um double por acaso?
[/quote]

Retorna um double mesmo.

o método insert é usado para acrescentar valores na string na posição q vc indicar:

aux.insert(0,“0”); //acrescenta no início da string: posição 0, valor a ser inserido “0”

Explicando melhor agora:

for(;aux.length()<tam;) aux.insert(0,"0");

A cada loop ele insere o “0” no início da string, fazendo com q a string aumente até ficar do tamanho desejado(tam)

O método length() retorna o tamanho da string, já em um vetor seria vetor.length, pois é um atributo.

Não é mágica, é tecnologia. :smiley:
Você pediu pra gerar números binários em ordem crescente e grava em uma matriz, não?

[list]1.Gero um número inteiro: a
2.converto o número em uma string de binários: aux
3.coloco zeros a esquerda (pra ficarem completos).
4.gravo no iny
5.incremento o valor do número e vou pro passo 2[/list]

[quote]
Então não seria mais fácil fazer assim se fosse uma squencia:[/quote]

:idea: Vou tentar fazer algo parecido, acho q pode dar certo transformando essa string em um vetor de char e colocar no iny, daqui a pouco te respondo.

Eu de novo!
Usando sua idéia Guilherme:

[code]public class Binarios {

   char[][] iny;
   int tam;

   public Binarios(int tam){
           this.tam = tam;
           iny = new char[(int)Math.pow(2,tam)][tam];
           magica();
           impressao();
    }


    public void magica(){

          for(int i = 0; i<Math.pow(2,tam); i++){
                        iny[i] = zeros(Integer.toBinaryString(i));
                        System.out.println(iny[i]);
          }


    }

    //essa função retorna um vetor char com zeros a esquerda
    private char[] zeros(String str){
            StringBuffer aux = new StringBuffer(str);
            for(;aux.length()<tam;)
                        aux.insert(0,"0");
            return aux.toString().toCharArray();
    }

    public void impressao(){

           for(int j=0; j<Math.pow(2,tam);j++){
                   for(int i=0; i<tam; i++)
                           System.out.print(iny[j][i]);
                   System.out.println();
           }

    }
    
    public static void main(String args[]){

           Binarios bin = new Binarios(5);
    }

}[/code]

Gostou como ficou agora? :? (é melhor responder sim…)

Qualquer dúvida é só postar!

Me expliquem uma caisa: pq isso tudo se a resposta ja tinha sido dada na pergunta???

me expliquem oq justifica tanto quebra a cabeça pra fazer um código maior que faz a mesma coisa, mas usa + memória e + processador?

Fácil: pq agora vc vai ter uma matriz do tamanho q vc escolher sem ter q fazer na raça. :smiley:

Tem outras soluções que gastem - memória e - processador, mas a sua é pra economizar na criação de algoritmos…

Pelo visto você não gostou de minha solução… :cry:

Quando Betinhum me mostrou esse programa que ele fez, lembrei de um que eu fiz no meu primeiro semestre na faculdade em qbasic. Implementamos em Java e resolvi postar.
Ahhh… roda mais rápido do que o dele. :slight_smile:
Falow galera! 8)

public class Logica{ int tam; int[][] tabela; public Logica(int tam){ this.tam = tam; tabela = new int[(int)Math.pow(2,tam)][tam]; magica2(); } public void magica2(){ int numLinhas =(int)Math.pow(2,tam);//número de linhas da matriz int j=0,//usado para indicar o índice da coluna i,//índice da linha linha,//usado para contar o número de dígitos que foram inseridos em cada coluna variacao;//usado para calcular a variacao de cada coluna for(int a=tam;a>0;a--){ i=0; for(linha=0;linha<numLinhas;){ for(variacao = (int)Math.pow(2,a)/2;variacao > 0;variacao--){ tabela[i][j]=0; linha++; i++; } for(variacao = (int)Math.pow(2,a)/2;variacao > 0;variacao--){ tabela[i][j]=1; linha++; i++; } } j++; } } public void impressao(){ for(int j=0; j<Math.pow(2,tam);j++){ for(int i=0; i<tam; i++) System.out.print(tabela[j][i]); System.out.println(); } } public static void main(String args[]){ Logica bin = new Logica(5); bin.impressao(); } }

Perai Betinhum, sua solução tá ótima, até d+, acho tá “superdimencionada” para o problema do Guilherme. Posso estar errado, mas povavelmente ele não vai criar um sistema “realmente util” com essa solução, ele vai fazer o programinha para algum motivo pessoal ou escolar e depois esse codigo (e o tempo q vc levou pensando nele) sera perdido no limbo.

O código sim, mas o tempo não exatamente. Afinal, desenvolvendo um algoritmo ele está refletindo e aprendendo sobre uma área que é do interesse dele, que de uma forma ou de outra estará sendo útil para seu futuro, nem que seja apenas para aumentar a facilidade com que ele pensa em novas soluções.

Como disse o Richard Gabriel nesta entrevista [quote]“The idea behind the MFA in software is that if we want to get good at writing software, we have to practice it, we have to have a critical literature, and we have to have a critical context.”[/quote]

Valeu Bani! :smiley:

Estou agora mesmo terminando de escrever um algoritmo de busca em Grafos(não é nada fácil), essa semana terminei tabela Hash e árvore Binária(essas duas vc pode encontrar em java.util prontas) sendo que comecei fazendo por ser um trabalho da disciplina Estrutura de Dados, mas continuei aperfeiçoando depois do semestre ter terminado.

Fiz o código pra Guilherme por ter achado interessante e levei como um desafio, não perdi tanto tempo assim(e mesmo se tivesse perdido não acho nada d+, valeu a pena!). Guilherme até gostou(acho…), fez perguntas e ainda mostrou outra solução!

Essa discussão já saiu de seu foco (iny[][] Preciso obter bla…bla…), ou saiu do iny[][] e foi pro bla…bla…

O Código era para resolver uma curiosidade minha mesmo, apenas obter uma tabela com todos as combinações possíveis de {0,1} em 5 casas.