A conjectura de Collatz é devida ao matemático
alemão Lothar Collatz. A conjectura estabelece uma seqüência de números, ou
trajetória, que a partir de um número natural inicial obedece aos seguintes
critérios: Pegue qualquer número
natural n . Se n é par, divida-o por 2 para obter n / 2, se n for ímpar multiplicá-lo por 3 e
adicionar 1 para obter 3 n + 1. Repita o processo (que tem sido
chamado de "Half Ou Triplo Plus One", ou HOTPO )
por tempo indeterminado. A
conjectura é que não importa o número que você começar, você sempre vai
eventualmente chegar a 1. A
propriedade também tem sido chamado de unidade .
Outras informações:
http://en.wikipedia.org/wiki/Collatz_conjecture
Considere o seguinte algoritmo:
http://en.wikipedia.org/wiki/Collatz_conjecture
Considere o seguinte algoritmo:
Consider the following algorithm: 1. input n 2. print n 3. if n = 1 then STOP 4. if n is odd then n = 3n + 1 5. else n = n / 2 6. GOTO 2
Dado o número 22 como entrada, a seguinte sequência de números é impressa até chegar na condição de parada do algoritmo 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
O problema 3n+1 pede para você calcular o tamanho da maior sequência gerada por um número em um dado intervalo.
|
A solução direta para esse problema seria assim:
#include <stdio.h> typedef long long int lli; lli cycle(lli n){ lli cont; cont = 1; while(n!=1){ if(n%2==0) n = n/2; else n = 3*n+1; cont++; } return cont; } int main(){ lli max; lli n,m,a,b,i,cont; while( scanf("%lld %lld",&n,&m) > 0 ){ a = n < m ? n: m; b = n > m ? n: m; max = 0; for(i=a;i<=b;i++){ cont = cycle(i); if(cont > max) max = cont; } printf("%lld %lld %lld\n",n,m,max); } return 0; }
2012-07-03 16:23:28 | The 3n plus 1 problem | accepted
|
0.29 | 1.6M | C |
Uma maneira
de otimizar esse código é aproveitar a sobreposição de subproblemas desse nesse
problema utilizando a memorização.
Com ela podemos evitar retrabalhos desnecessários.
#include <stdio.h> typedef long long int lli; lli mem[1000001]; lli cycle(lli n){ lli t=1; lli temp = n; while(n!=1LL){ if(n%2==0) n = n/2; else n = 3*n+1; if(n<=1000000 && mem[n]!=0){ if(temp <= 1000000){ mem[temp] = mem[n] + t; return mem[temp]; }else{ return mem[n]+t; } } t++; } if(temp <=1000000) mem[temp] = t; return t; } int main(){ lli max; lli n,m,a,b,i,cont; while( scanf("%lld %lld",&n,&m) > 0 ){ a = n < m ? n: m; b = n > m ? n: m; max = 0; for(i=a;i<=b;i++){ cont = cycle(i); if(cont > max) max = cont; } printf("%lld %lld %lld\n",n,m,max); } return 0; }
2012-07-03 16:25:58 | The 3n plus 1 problem | accepted
| 0.03 | 9.3M | C |
Outros links interessantes:
http://www.marcioalthmann.net/2011/06/conjectura-de-collatz/
http://timeroot.zxq.net/collatz.html
Se você gostou dessa postagem, deixe um comentário e curta a nossa página no facebook!
http://www.marcioalthmann.net/2011/06/conjectura-de-collatz/
http://timeroot.zxq.net/collatz.html
Se você gostou dessa postagem, deixe um comentário e curta a nossa página no facebook!
5 comentários:
mt bom wladimir
Esse problema foi atualizado no site Wladimir. O enunciado agora afirma que nenhuma operação precisará de mais que 32 bits.
Saudações pessoal ...
Bom blog este hein e ainda mais este post em particular.
Seguinte: sabiam que em 2011 um pesquisador alemão chamado Gehard Opfer publicou uma possível prova deste problema algorítmico tão famoso ?
Enfim, ainda não saiu o veredicto da comunidade acadêmica internacional, mas de qualquer forma é um início, certo ?!?!
Então, desde já grato por tudo e até qualquer dia por aew ...
Tchau e fui
Estive brincando com a conjectura, se tiver curiosidade de ver está aqui:
http://aleatorys.blogspot.com.br/2016/07/estive-brincando-com-conjectura-de.html?spref=fb
Postar um comentário