Created
October 23, 2023 21:15
-
-
Save bakudas/8b6d34f841f7aabea500ab1f018d2a0a to your computer and use it in GitHub Desktop.
Conjectura de Collatz em C
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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