首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用C++计算Hailstone序列中的奇数

如何使用C++计算Hailstone序列中的奇数
EN

Stack Overflow用户
提问于 2014-09-08 02:39:38
回答 1查看 1.2K关注 0票数 0

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

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

代码语言:javascript
运行
复制
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)。不过,我不知道如何修改这点。

我非常希望能有任何意见来帮助解决这个问题。此外,为了方便您,我将在上面的一个函数中包含其他两个函数的定义。

代码语言:javascript
运行
复制
//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; 
    }
}
EN

回答 1

Stack Overflow用户

发布于 2014-09-08 02:42:12

因为循环在n变成1之后就停止了,所以知道总是会多出一个奇数。因此,改变很简单:

代码语言:javascript
运行
复制
return count + 1;

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

代码语言:javascript
运行
复制
return n % 2 == 0;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25716773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档