Skip to content

Instantly share code, notes, and snippets.

@bakudas
Created October 23, 2023 21:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bakudas/8b6d34f841f7aabea500ab1f018d2a0a to your computer and use it in GitHub Desktop.
Save bakudas/8b6d34f841f7aabea500ab1f018d2a0a to your computer and use it in GitHub Desktop.
Conjectura de Collatz em C
// Conjectura de Collatz - Console App
/*
Desafio de criar programa problema utilizando a conjectura de Collatz. Esta conjuntura toma um número natural “n”, se n for
par, será dividido por 2; se n for ímpar, será multiplicado por 3 e ao resultado será somado 1. Repete-se o processo
indefinidamente. A Conjectura de Collatz estabelece que, com essas duas regras simples, todos os números naturais
chegam até 1 (e a partir daí o laço 1,4,2,1,4,2,1,4,2,1... se repete indefinidamente).
Matematicamente, as regras são:
(n) = n/2 se n é par
(n) = 3n + 1n se n é ímpar
A sequência de comandos é:
• Entrar com um número inteiro positivo superior a 1.
• Se o número for par, dividir por dois,
• Se o número for ímpar, multiplicar por três e somar 1
• Pela conjectura de Collatz, a sequência sempre termina em 1, como já foi explanado.
Solicitar o número cuja sequência de Collatz será calculada.
*/
// DESAFIO adicional 1: escrever o código usando ponteiros.
// DESAFIO adicional 2: utilizar recursão.
// função recursiva para iterar a proposição da conjectura
int *collatz(int *n){
// condicional para sair da função
if (*n <= 1)
return n;
// condiciona para realizar o calculo da conjectura
// Se o número for par, dividir por dois,
// Se o número for ímpar, multiplicar por três e somar 1
*n = *n % 2 == 0 ? *n / 2 : *n * 3 + 1;
printf(" -> %d ", *n); // printa o valor que está no endereço de memória de num
printf("(endereco: %p)", n); // printa o espaço da memória de n, que deve ser igual de num
n = collatz(n); // chama a função novamente até a primeira condição do método ser verdadeira
return n;
}
int main() {
int *num; // cria o ponteiro para receber os valores
printf("Entre com o numero: \n");
scanf("%d", &num); // solicita no console o número
printf("%d", num); // printa o número escolhido
printf(" (endereco: %p)", &num); // printa o espaço da memória de num
num = collatz(&num); // chamada da função recursiva
return 0;
}
/*
OUTPUT:
Entre com o numero:
22
22 (endereco: 000000dc7d5ffde8) -> 11 (endereco: 000000dc7d5ffde8) -> 34 (endereco: 000000dc7d5ffde8) -> 17 (endereco: 0
00000dc7d5ffde8) -> 52 (endereco: 000000dc7d5ffde8) -> 26 (endereco: 000000dc7d5ffde8) -> 13 (endereco: 000000dc7d5ffde8
) -> 40 (endereco: 000000dc7d5ffde8) -> 20 (endereco: 000000dc7d5ffde8) -> 10 (endereco: 000000dc7d5ffde8) -> 5 (enderec
o: 000000dc7d5ffde8) -> 16 (endereco: 000000dc7d5ffde8) -> 8 (endereco: 000000dc7d5ffde8) -> 4 (endereco: 000000dc7d5ffd
e8) -> 2 (endereco: 000000dc7d5ffde8) -> 1 (endereco: 000000dc7d5ffde8)
Process finished with exit code 0
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment