c++ - 如何使用 C++ 计算 Hailstone 序列中的奇数个数

标签 c++

我目前正在大学注册一个 Into to C++ 类(class)。其中一项作业要求学生创建一个 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; 
}

我遇到的问题是此函数返回的值比正确的数字少 1。例如,如果有四个奇数,它会打印 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 变为 1 时立即停止,您知道总是还有一个奇数。所以改变很简单:

return count + 1;

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

return n % 2 == 0;

关于c++ - 如何使用 C++ 计算 Hailstone 序列中的奇数个数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25716773/

相关文章:

c++ - 在两个派生类之间进行转换

c++ - 创建一个动态数组,同时延迟对象构造

c++ - 在 exec 和 shared libaray 中编译时,全局变量在 Windows 上有多个拷贝,在 Linux 上有一个拷贝

c++ - 全局变量作为默认参数

C++整数层函数

c++ - 如何从发布版本的回溯中恢复符号?

c++ - 标准全局默认运算符 new 的对齐限制是什么?

C++ 任务不正确的结果

c++ - 交换动态分配的数组错误

c++ - 什么是 NULL 值