3
Hello, all right? Please review this code:
#define max 4294967295
unsigned long int collatz(unsigned long int n, unsigned long int passos, float *maiorN) {
float overflow = 3 * n + 1;
if (n == 1)
return passos;
else if (n % 2 == 0)
return collatz(n / 2, passos + 1, maiorN);
else if ((overflow) < max) {
if (overflow > *maiorN)
*maiorN = overflow;
return collatz(overflow, passos + 1, maiorN);
}
else
return -1;
}
The value defined as max is the largest possible value to store in the unsigned long int type. What happens is that it is quietly stored in a float. The idea is to test multiplication and if it gives greater than the max constant the program should return -1.
However, it seems that there is something wrong when this value is passed to the printipal function via the pointer.
Could someone help me, please?
EDIT: I leave the main implementation below
int main(int numargs, char *args[]) {
unsigned long int passos, n, maiorP, total, N, media;
FILE *arquivo;
int inicio, fim;
float maiorN;
inicio = N = atoi(args[1]);
fim = atoi(args[2]);
passos = total = maiorP = 0;
maiorN = 1;
arquivo = fopen("Log.txt", "w+");
printf("Teste Num passos\n");
fprintf(arquivo, "Teste Num passos\n");
for (n = inicio; n <= fim; n++) {
passos = collatz(n, passos, &maiorN);
if (passos > maiorP) {
N = n;
maiorP = passos;
}
if (passos == -1)
break;
total += passos;
fprintf(arquivo, "%lu %10lu\n", n, passos);
printf("%lu %10lu\n", n, passos);
passos = 0;
}
media = total/(fim - inicio);
printf("\nForam testados %d numeros\n", fim - inicio + 1);
printf("\nDentre os valores testados o num %lu levou %lu passos para convergir para 1 e atingiu o valor maximo de %.0f", N, maiorP, maiorN);
printf("\nA media de passos para chegar em 1 foi de %lu passos\n", media);
fprintf(arquivo, "\nForam testados %d numeros\n", fim - inicio + 1);
fprintf(arquivo, "\n\nDentre os valores testados o num %lu levou %lu passos para convergir para 1 e atingiu o valor maximo de %.0f", N, maiorP, maiorN);
fprintf(arquivo, "\nA media de passos para chegar em 1 foi de %lu passos", media);
fclose(arquivo);
return 0;
}
Related: https://pt.wikipedia.org/wiki/Conjectura_de_Collatz
– Victor Stafusa
Interestingly the number of steps to converge to 1 is being calculated correctly. The only thing that is not hitting is the maximum values reached in each iteration. I’m going to put the main int here on Edit
– Lucas Lopes