【问题标题】:While loop in function not terminating函数中的while循环未终止
【发布时间】:2020-02-22 00:57:44
【问题描述】:

我知道答案可能很简单,但我几乎已经筋疲力尽地尝试了我在 c++ 中所知道的一切,这并不多。第一个函数有效,据我所知,我只是无法终止循环。

#include <iostream>
#include <cstdlib>

using namespace std;

unsigned int reverseInt(unsigned int num)
{
    unsigned int rem, reverse;

    while(num > 0)
    {
        rem = num % 10;
        reverse = reverse * 10 + rem;
        num /= 10;
    }
    return reverse;
}

unsigned int generateSequence(unsigned int num, ostream& out)
{
    unsigned int k = 0;

    while(num != 1)
    {
        num = num + 4;
        num = reverseInt(num);
        k++;
        out  << ", " << num;
    }
    out << endl;
    return k;
}

【问题讨论】:

  • 请将其设为minimal reproducible example。没有什么遗漏,但main 会很好,你必须告诉我们你使用了什么输入
  • 还解释了代码应该做什么。为什么你期望循环终止?如何将4 添加到num 最终使其等于1?如果num 以5 开头怎么办?
  • @idclev463035818 这不只是加 4,它也是倒数。没有reverse的bug,当num开始为5时,52步后会达到1。
  • 阅读this article 了解调试代码的技巧。

标签: c++ while-loop


【解决方案1】:

代码问题很少

  1. reverse 变量在函数 reverseInt 中甚至没有被初始化一次。

  2. num 变量未减为 1,循环不会终止。

【讨论】:

  • "所以,我想说,请描述你想在每个函数中做什么,然后我们将能够更好地帮助你。" 评论部分会是一个更好的地方把这句话说出来。我知道您想提供帮助,但建议您不要回答尚未明确定义的问题。
【解决方案2】:

在分析你的逻辑时,看起来你有一个有限循环,随着位数的增加,结果会更高。

当 4 的总和达到以 6 结尾的数字时,您的应用程序会减少位数,但是由于您的 unsigned int 类型具有更高的范围。

如果您达到阈值位数,则应用程序将超时,这会产生更多结果供编译器退出,例如 5 位数作为阈值,例如:11111。

【讨论】:

    【解决方案3】:

    您的问题主要是reverse 未初始化,至少在clang 和gcc 上这意味着reverse 将以其最大值(2^64)初始化。

    这意味着你的循环永远不会结束,因为 num 越来越大,你会有很多整数溢出,但是由于 num 是从reverse 的返回值分配的,所以 num 永远不会达到 1

    【讨论】:

      猜你喜欢
      • 2017-09-17
      • 1970-01-01
      • 2017-02-09
      • 2017-06-04
      • 1970-01-01
      • 1970-01-01
      • 2017-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多