Как подсчитать количество нечетных чисел в последовательности Hailstone, используя C ++

0

В настоящее время я участвую в классе 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; 
    }
}
  • 0
    Обратите внимание, что в вашем цикле n = nextVal(n); приходит после if (!isEven(n)){} . Поэтому, когда вы переходите от 2 к 1 а затем условие цикла нарушается ( while (n != 1) ), вы не выполняете это if (!isEven(n)) последний раз.
  • 0
    @IwillnotexistIdonotexist Если вы предполагаете, что OP меняет порядок логики, это проблематично, поскольку иногда он дает правильный ответ, а иногда нет, в зависимости от того, является ли n нечетным или четным. С другой стороны, данное решение отключается по одному каждый раз, поэтому исправить это просто.
Показать ещё 1 комментарий
Теги:

1 ответ

1

Поскольку цикл останавливается, как только n становится 1, вы знаете, что всегда есть еще одно нечетное число. Таким образом, изменение простое:

return count + 1;

Обратите внимание, что вы можете уменьшить свою isEven() до одной строки:

return n % 2 == 0;
  • 0
    Благодарю. Я понятия не имею, как это ускользнуло от меня :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню