【问题标题】:How to count the number of odd numbers in a Hailstone Sequence using C++如何使用 C++ 计算冰雹序列中奇数的个数
【发布时间】:2015-08-21 16:09:04
【问题描述】:

我目前在大学就读于 Into to C++ 课程。其中一项作业要求学生创建一个 C++ 程序,提示用户输入一个整数,然后显示从输入的值开始到 1 结束的冰雹序列。此外,还要求程序输出以下内容: 1.序列的长度 2. 序列中最大的数 3.序列中奇数个数 4.从1到输入值n的最长序列

我已完成所有要求,除了第 3 项。下面是我为完成此任务而创建的函数的副本。

int oddCont(int n)
{

    int count = 0; 
    while (n != 1) 
    {
        if (!isEven(n))
        {
            count++; 
        }
        n = nextVal(n);
    }

    return count; 
}

我遇到的问题是这个函数返回的数字比正确的数字少一。例如,如果有四个奇数,它会打印 3。我还发现,具体来说,问题在于该函数没有将序列中的最后一个数字 1 计为奇数。因此,如果我要获得以 7 开头并以 1 结尾的冰雹序列,它将计算除 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 = nextVal(n); 位于 if (!isEven(n)){} 之后。因此,当您从 2 转到 1 然后循环的条件被破坏(while (n != 1))时,您不会最后一次执行 if (!isEven(n))
  • @IwillnotexistIdonotexist 如果您建议 OP 切换逻辑顺序,这是有问题的,因为它有时会给出正确的答案,有时不会,这取决于 n 是奇数还是本身.另一方面,给定的解决方案每次都会关闭一个,因此修复很简单。
  • @Code-Apprentice 我希望以带有标头的循环的形式更多地构建代码,例如 count = !isEven(n); while(){ /* ... */ count += !isEven(n);},但您的方法也非常正确,而且确实更简单。

标签: c++


【解决方案1】:

由于循环在n 变为 1 时立即停止,因此您知道总是还有一个奇数。所以改变很简单:

return count + 1;

请注意,您可以将 isEven() 函数减少为一行:

return n % 2 == 0;

【讨论】:

    猜你喜欢
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多