Проблема в j = j * 3 + 1;
, «j» продолжает увеличиваться, если «j» больше 1 и нечетно.Таким образом, он висит на calculate(int j,int *num)
, поскольку цикл while внутри него работает бесконечно (значение j через некоторое время будет сброшено).
Редактировать:
Я накопил все исправления и добавил код:
main.c:
#include "input_output.h"
#include <stdlib.h>
int main()
{
int i=0, j=0;
int *num,*ori; //New pointer required to remember the start position of num
int maxCycle;
int length;
input(&i, &j);
length = j - i + 1;
num = (int*)calloc((size_t)(j-i+1),sizeof(int));
ori=num;
while (i <= j)
{
calculate(j, num);
j--;
num++;
}
num=ori;
maxCycle = findMax(length, num);
num=ori;
output(maxCycle);
return 0;
}
input_output.h:
#ifndef INPUT_OUTPUT_H
#define INPUT_OUTPUT_H
void input(int *i, int *j);
void calculate(int j,int *num);
int findMax(int length, int* num);
void output(int maxout);
#endif
input_output.c:
#include <stdio.h>
#include "input_output.h"
void input(int *i, int *j) {
printf("Enter the i & j:\n");
scanf("%d%d",i,j);
printf("Values entered:\ni: %d\nj: %d",*i,*j);
}
void calculate(int j, int* num) {
while (j > 1) {
if (j==1)
break;
if (j % 2 == 0) {
j = j / 2;
(*num)++;
}
else{
j = j * 3 + 1;
(*num)++;
}
}
printf("\nLength Value: %d\n",*num);
}
int findMax(int length, int * num){
int max = 0;
int idx = 0;
printf("\nLength Values:\n");
while (idx < length) {
printf("%d ",*num);
if (*num > max)
max = *num;
idx++;
num++;
}
return max;
}
void output(int maxout) {
printf("\nResult: %d", maxout);
}
Компиляция в Linux с использованием: gcc input_output.c main.c -Wall -Wextra -pedantic -Wconversion -std=gnu11 -o collatz
Для уточнения, пожалуйста, прокомментируйте.