我目前正在大学注册一个 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/