В настоящее время я участвую в классе C++ в колледже. Одно из заданий требует, чтобы учащиеся создали программу C++, которая запрашивает у пользователя целое число, затем отображает последовательность градиента, начиная с введенного значения и заканчивая на 1. Кроме того, требуется также, чтобы программа выводила следующее: 1 длина последовательности 2. наибольшее число в последовательности 3. число нечетных целых чисел в последовательности 4. самая длинная последовательность от 1 до введенного значения n
Я выполнил все требования, за исключением третьего элемента. Ниже приведена копия функции, которую я создал для выполнения этой задачи.
int oddCont(int n)
{
int count = 0;
while (n != 1)
{
if (!isEven(n))
{
count++;
}
n = nextVal(n);
}
return count;
}
Проблема, которую я испытываю, заключается в том, что эта функция возвращает на один меньше, чем правильное число. Например, если есть четыре нечетных числа, он печатает 3. Я также обнаружил, что проблема, в частности, заключается в том, что функция не учитывает последнее число в последовательности, 1, как нечетное целое число. Итак, если бы я получил последовательность градиента, начинающуюся с 7 и заканчивая одним, она учитывала бы все нечетные числа, но 1 (7, 11, 17, 13 и 5). Однако я не уверен, как это изменить.
Я был бы очень признателен за любые советы, которые помогут решить эту проблему. Кроме того, для вашего удобства я буду включать определения для двух других функций, вызванных в приведенном выше.
//returns true if n is even and false otherwise
bool isEven(int n)
{
if (n % 2 == 0)
{
return true;
}
else
{
return false;
}
}
//returns hailstone sequence value that proceeds n
int nextVal(int n)
{
if (isEven(n))
{
return n/2;
}
else
{
return 3 * n + 1;
}
}
Поскольку цикл останавливается, как только n
становится 1, вы знаете, что всегда есть еще одно нечетное число. Таким образом, изменение простое:
return count + 1;
Обратите внимание, что вы можете уменьшить свою isEven()
до одной строки:
return n % 2 == 0;
n = nextVal(n);
приходит послеif (!isEven(n)){}
. Поэтому, когда вы переходите от2
к1
а затем условие цикла нарушается (while (n != 1)
), вы не выполняете этоif (!isEven(n))
последний раз.n
нечетным или четным. С другой стороны, данное решение отключается по одному каждый раз, поэтому исправить это просто.