Код для поиска начального числа в гипотезе Коллатца при заданной длине бесконечной петли

Я в основном сказал это в заголовке, но я пытаюсь написать программу, которая даст мне начальное целое число для минимальной длины. Я написал другую программу, которая будет рассчитывать длину с учетом начального целого числа, но у меня много неприятностей, обращающихся вспять, даже используя предыдущий код в качестве основы. Я поставил целевую длину 3, что должно остановить код на х = 2, но это не так. Вместо этого он зацикливается, но я не уверен почему.

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
char choice; //whether the program will run again

do
{
int x = 1; //starting integer
int targetK = 0; //desired minimum length
int i = 0; //number of iterations run
int lengthK = 0; //length of sequence

cout << "\nEnter a required length." << endl;
cin >> targetK;

while (lengthK < targetK)
{
int lengthK = 1; //length of sequence

do
{
cout << x << endl;

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

i++;
x += i;
}

cout << x;
cout << "\nLength of sequence before repeating: " << lengthK << endl;
cout << "Would you like to run the function again? (Y/N)" << endl;
cin >> choice;
} while (choice == 'y' || choice == 'Y');

return 0;
}

Cout просто так, я знаю, что он работает должным образом — или, в данном случае, как я знаю, что это не так.

0

Решение

Итак, я вижу четыре проблемы с вашим кодом. Сначала вы создаете новую локальную переменную lengthK внутри вашего цикла с заявлением int lengthK = 1;, Эта переменная имеет то же имя, что и переменная вне вашего цикла, которую вы используете для проверки условия завершения, но это другая переменная. Поскольку вы ничего не делаете со значением, кроме увеличения его внутри цикла, я предполагаю, что это было ошибкой и что вы действительно хотели работать с переменной, которую вы объявили первой. Это основная причина вашего бесконечного цикла.

Вы можете исправить это, просто сказав lengthK = 1;, Просто бросьте int и вы больше не будете объявлять новую переменную с ограниченным временем жизни циклом, а вместо этого будете изменять значение существующей переменной. Я действительно думаю, что это должно быть lengthK = 0;, но это во многом зависит от других деталей.

Вторая проблема, которую я вижу, это то, что вы делаете x += i;, Я уверен, что вы просто хотите x = i;, хоть x += i; может случайно работать, потому что x всегда равен 1, когда он попадает в этот кусок кода. x = i; наверняка будет понятнее.

Третья проблема также сложна, потому что трудно точно знать ваше намерение. Но я думаю, что вы хотите while цикл с тестом вверху, а не do петля для вашей внутренней петли.

Последняя проблема проще и влияет только на полезность вашего вывода, а не на правильность алгоритма. Вы, вероятно, хотите распечатать x - 1 и не x потому что ценность x это фактически дало вам достаточно длинную цепочку Коллатца на единицу меньше, чем значение х будет иметь при выходе из цикла.

Я позволил себе отредактировать ваш вопрос, чтобы немного сжать ваш код. Осторожный отступ — это действительно хорошая привычка, и мне было приятно это видеть. Но лишние пробелы почти так же плохи, как слишком мало.

Вот версия вашего кода, которую я модифицировал, чтобы она решала вашу проблему. Я удалил endl в большинстве мест, чтобы он работал быстрее.

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
char choice; //whether the program will run again

do
{
int x = 1; //starting integer
int targetK = 0; //desired minimum length
int i = 0; //number of iterations run
int lengthK = 0; //length of sequence

cout << "\nEnter a required length." << endl;
cin >> targetK;

do
{
++i;
x = i;
lengthK = 1; //length of sequence

cout << "Testing " << x << "\n  ";
while (x != 1)
{
cout << x << " -> ";

if (x % 2 == 0)
{
x /= 2;
}
else
{
x = x * 3 + 1;
}
lengthK++;
}
cout << "1\n";
} while (lengthK < targetK);

cout << i;
cout << "\nLength of sequence before repeating: " << lengthK << endl;
cout << "Would you like to run the function again? (Y/N)" << endl;
cin >> choice;
} while (choice == 'y' || choice == 'Y');

return 0;
}
0

Другие решения

Других решений пока нет …