Я в основном сказал это в заголовке, но я пытаюсь написать программу, которая даст мне начальное целое число для минимальной длины. Я написал другую программу, которая будет рассчитывать длину с учетом начального целого числа, но у меня много неприятностей, обращающихся вспять, даже используя предыдущий код в качестве основы. Я поставил целевую длину 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 просто так, я знаю, что он работает должным образом — или, в данном случае, как я знаю, что это не так.
Итак, я вижу четыре проблемы с вашим кодом. Сначала вы создаете новую локальную переменную 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;
}
Других решений пока нет …