Hello, how are you? 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 set to max is the largest possible value to store in type unsigned long int. It turns out it is quietly stored in a float. The idea is to test the multiplication and if it gives greater than the max constant the program should return -1.
However, there seems to be something wrong when this value is passed to the printipal function through the pointer.
Could someone please help me?
EDIT: I leave below the implementation of main
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;
}