0

我正在开发一个非常小的程序来查找 C++ 中整数的除数。我的 main 方法几乎将 int 转换为 var,并以 int 作为参数调用 factor 方法。这是代码:

void factor(int num)
{
    for(int x = 0; x < ((num + 2) / 2); x++)
    {
        if((num % x) == 0)
        {
            cout << x << " ";
        }
    }
}

程序总是在 factor() 内崩溃。如果我使用此代码,它运行良好:

void factor(int num)
{
    for(int x = 0; x < ((num + 2) / 2); x++)
    {
        {
            cout << x << " ";
        }
    }
}

所以问题出在if((num % x) == 0). 当我将该行更改为if((num % 2) == 0)orif((num % 5) == 0)时,它会产生正确的结果(我使用 32 作为测试输入)。

几年前我学习了 C++ 并忘记了其中的大部分内容,在遇到这个问题之后,我逐字逐句地复制了我之前解决这个问题的解决方案(有效)。但是每当我尝试访问循环计数器时,程序仍然会崩溃。

我在 Arch Linux 64 位上使用 Code::Blocks 13.12 和 GCC "4.9.0 20140604 (prerelease)"。

4

4 回答 4

7

问题是你的第一个片段中有一个被零除的东西,根据标准(n3337)这是未定义的行为:

5.6p4 乘法运算符 [expr.mul]

二元/运算符产生商,二元运算符产生%第一个表达式除以第二个表达式的余数。如果/or的第二个操作数%为零,则行为未定义。


由于程序无法计算此类表达式的值,因此它将崩溃。

if((num % x) == 0)  // num % 0 on first iteration, application will crash, or order pizza
{
  cout << x << " ";
}
于 2014-06-14T09:11:25.717 回答
2

num%x当 x 为 0 时,你怎么办?由于 x 为 0 时使用,程序崩溃。

这会导致运行时错误,我认为是SIGFPE.

于 2014-06-14T09:11:08.857 回答
0

在 for x 的第一个周期中,值为 0。 num % x 需要除以 0,这是一个数学上的废话,这就是崩溃的地方。

您想查看数字的所有除数(它们将数字除以 0 来结转)。您应该从 2 开始 for 循环。(1 已经是给定的 - 您可以直接将他打印出来,但您只需要一半的数字,所以我怀疑您对 1 和数字本身不感兴趣)。

于 2014-06-14T09:15:35.907 回答
0

尝试从x = 1.

如果要计算数字的因数,从 0 开始没有任何意义。运算符计算除法的%余数num/x。除以 0 没有任何意义,因此操作的行为是未定义的。这意味着它可以与一个编译器/机器崩溃,并可以在另一个编译器/机器上产生某种结果。

于 2014-06-14T09:20:50.920 回答