officialandrey
@officialandrey

Почему выходит из цикла?

Супер простая программа, но что-то я туплю: ( Почему выходит из цикла?
Цель:
Есть число a. Если оно делиться на 2 без остатка (то-есть четное a), тогда выполняем операцию a=a/2,
в ином случаи (если число a не четное), выполняем операцию a=a*3+1, и проводим итерацию до тех пор пока a==1 (пока число не будет ровняться 1).
Как только число a=1, выходим из цикла и выводим его.

int main() {
	
	int i, j, N = 6, res;

	for (i = 0; i < N; i++) {
		res = 2;
		for (j = 0; res == 1; j++) {
			if (res % 2 == 0) {
				res = res / 2;
			}
			else {
				res = ((res * 3) + 1);
			}
			printf("\t %d", res);
		}
		printf("%d %d \n", i, res);
		res++;
	}

	return 0;
}
  • Вопрос задан
  • 141 просмотр
Пригласить эксперта
Ответы на вопрос 2
0xD34F
@0xD34F
Во-первых - неправильное условие окончания внутреннего цикла.

Во-вторых - вы используете переменную res в двух качествах - как начальное значение последовательности, и как текущее значение последовательности. Очевидно, это должны быть две разные переменные.

В-третьих - почему вы на каждой итерации внешнего цикла в качестве начального значения последовательности задаёте 2? Очевидно, что так вы будете получать каждый раз один и тот же результат, что вряд ли входит в ваши планы.

В-четвёртых - зачем для внутреннего цикла использовать for? Достаточно и while.

Вот вам исправленный вариант вашего кода, думайте:

int
  N = 6,
  start = 2;

for (int i = 0; i < N; i++) {
  int val = start;

  printf("\n%d: ", val);

  while (val != 1) {
    if (val % 2 == 0) {
      val = val / 2;
    } else {
      val = val * 3 + 1;
    }

    printf("\t%d", val);
  }

  start++;
}
Ответ написан
Комментировать
bogolt
@bogolt
А что умение дебажить в уме ( на листе бумаги ) или даже дебаггером уже совершенно утеряно у подрастающих поколений? По-моему ответы на подобные вопросы просто вредны для самого специалиста, ну или человека который хочет стать таковым.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы