Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Zinhani

Análise combinatória no php

Recommended Posts

Olá pessoal,

 

Estava fazendo um script para resolver um problema pessoal quando por curiosidade resolvi brincar um pouco com ele.

tentei simular os 50.063.860 Milhões de resultados da mega sena mas o script simplesmente não é executado.

Como não fazia menor ideia de como fazer analise combinatória, adaptei um exemplo que peguei no phpbrasil do Marcos Regis,

funcionou perfeitamente, mas quando adaptei para simular o jogos da mega deu problema

 

Script:

 

// Array com os 60 numeros da mega sena
$numeros = array('1','2','3','4','5','6','7','8','9','10',
'11','12','13','14','15','16','17','18','19','20',
'21','22','23','24','25','26','27','28','29','30',
'31','32','33','34','35','36','37','38','39','40',
'41','42','43','44','45','46','47','48','49','50',
'51','52','53','54','55','56','57','58','59','60');

// Array que vai receber os resultados
$jogos=array();

// variavel para os 6 numeros jogados
$n1 = $n2 = $n3 = $n4 = $n5 = $n6 = '';

// calculo
foreach($numeros as $a1=>$n1){
	for($a2 = $a1 + 1; $a2 < count($numeros); $a2++){
		$n2 = $numeros[$a2];
		for($a3 = $a2 + 1; $a3<count($numeros); $a3++){
			$n3=$numeros[$a3];
			for($a4 = $a3 + 1; $a4<count($numeros); $a4++){
				$n4 = $numeros[$a4];
				for($a5 = $a4 + 1; $a5<count($numeros); $a5++){
					$n5 = $numeros[$a5];
					for($a6 = $a5 + 1; $a6<count($numeros); $a6++){
						$n6 = $numeros[$a6];				
						$jogos[] = array($n1,$n2,$n3,$n4,$n5,$n6); 
					}
				}
			}
		} 
	} 
} 

echo "Criada " . count($jogos) . " combinacoes. Exibindo: = ";
// echo '<pre>';
print_r($jogos);
// echo '</pre>';

Será que o php aguenta?

por curiosidade tentei fazer isso:

 

for ($i = 1; $i <= 1000000; $i++) {
    echo $i.'<br>';
}

E demora uma eternidade para concluir.

 

Então eu pergunto: como fazer no php um calculo dessa proporção?

 

Vlw

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seu cálculo deve estar errado.

 

É evidente que, por ser uma linguagem poderosíssima, o PHP aguenta fazer isso:

 

for ($i = 1; $i <= 1000000; $i++) {
}
Agora, fazer isso:

 

for ($i = 1; $i <= 1000000; $i++) {
 echo $i.'<br>';
}

Quem não aguenta é o browser.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seu cálculo deve estar errado.

 

É evidente que, por ser uma linguagem poderosíssima, o PHP aguenta fazer isso:

 

for ($i = 1; $i <= 1000000; $i++) {
}
Agora, fazer isso:

 

for ($i = 1; $i <= 1000000; $i++) {
 echo $i.'<br>';
}

Quem não aguenta é o browser.

 

OK refaço a pergunta então

Sabendo que calcular o php calcula

Como fazer com que o php mostre isso no browser?

É claro que estou me referindo ao exemplo da mega sena e não do 2º ex do for.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A maneira mais simples e rápida (e mais leve para o browser) é mostrar o resultado do array em uma tag pré-formatada, como o <pre>:

 

echo '<pre>';
print_r($array);

Compartilhar este post


Link para o post
Compartilhar em outros sites

A maneira mais simples e rápida (e mais leve para o browser) é mostrar o resultado do array em uma tag pré-formatada, como o <pre>:

 

echo '<pre>';
print_r($array);

Já esta no meu exemplo, o problema é que o php não executa e nem me informa o erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

OBS: Também vou dar uma olhada.

 

Veja só, debugando rapidamente o que eu posso ver:

 

// calculo
foreach($numeros as $a1=>$n1) {
	for($a2 = $a1 + 1; $a2 < count($numeros); $a2++) {
		$n2 = $numeros[$a2];
		for($a3 = $a2 + 1; $a3<count($numeros); $a3++) {
			$n3=$numeros[$a3];
			for($a4 = $a3 + 1; $a4<count($numeros); $a4++) {
				$n4 = $numeros[$a4];
				for($a5 = $a4 + 1; $a5<count($numeros); $a5++) {
					$n5 = $numeros[$a5];
					for($a6 = $a5 + 1; $a6<count($numeros); $a6++) {
						$n6 = $numeros[$a6];
						$jogos[] = array($n1,$n2,$n3,$n4,$n5,$n6);
						break;
					}
					break;
				}
				break;
			}
			break;
		}
	}
	
}

Você deve encontrar uma solução para não atingir o limite máximo de alocamento de memória.

 

COM CERTEZA tem um jeito mais simples de fazer isso.

 

Dê uma olhada na função que o João fez, postada acima, e pense em como adaptá-la para resolver o seu problema.

 

OBS: É evidente que eu não vou resolver o problema pra você, afinal dessa maneira você não vai aprender a resolvê-lo e, mais importante ainda, não vai saber onde está o erro.

 

Rode o código que eu postei e veja o resultado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma possível solução em java.

class Combinacoes{  
          
        private int numeros[] = {1,2,3,4,5,6,7,8,9,10};  
        private int quantidade = 3;  
        private int resultado[] = new int[3];  
      
        private int count = 0;  
      
        private void busca(int inicio,int fim, int profundidade){  
     
           if ( (profundidade + 1) >= quantidade)  
           for(int x = inicio; x <= fim; x++){  
               resultado[profundidade] = numeros[x];  
               // faz alguma coisa com um dos resultados possiveis  
             count++;  
               System.out.println(resultado[0] + ", " + resultado[1] + ", " + resultado[2] + "\n");  
          }  
       else  
           for(int x = inicio; x <= fim; x++){  
               resultado[profundidade] = numeros[x];  
              busca(x + 1,fim + 1,profundidade + 1);  
           }  
       }  
    
       public static void main(String args[]){  
    
          Combinacoes comb = new Combinacoes();  
          comb.busca(0, (10-3), 0);  
          System.out.println("Total de combinacoes: " + comb.count);  
    
       }  
   }

Adapta para php e depois posta aí pra nós.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.