用于定义数字是否为素数的函数会导致c ++程序崩溃

时间:2016-08-05 14:23:08

标签: c++ codeblocks

我一直试图创建这个程序好几个小时,并且已经到了我完全被难过的地步。我在代码块中使用GNU GCC编译器。

#include <iostream>

using namespace std;

bool Is_Prime(int number);

int main() {
    if (Is_Prime(3)) {
        cout << "Prime" << endl;
    }
    system("pause");
}
bool Is_Prime(int number) {
    int x = 0;
    for (int i = 0; i <= number; i++) {
        if ((number % i) == 0) {
            x = x + 1;
        }
        if (x > 2) {
            return false;
        }
    }
    return true;
}

它可能是一些愚蠢的东西,但我只是编程的新手

2 个答案:

答案 0 :(得分:2)

TL; DR:修复方法是从1开始循环,而不是从0开始:

...
for (int i = 1; i <= number; i++) {
...

此外,您无需检查1number的所有数字,以确保number为素数。第一个除数一发现,你就可以确定number不是素数。如果从1sqrt(number)找不到除数,则可以确定number是素数。还有1的特殊情况。

所以,让我稍微改进你的代码:

bool Is_Prime(int number)
{
  for (int i = 2; i * i <= number; ++i)
  {
    if (number % i == 0)
    {
      return false;
    }
  }
  return number > 1;
}

UP :另外,如果您希望可以对接近std::numeric_limits<int>::max()的数字执行您的程序,则行i * i可能会溢出。在这种情况下,您可能会使用不太可读但更安全的替代方案:

i <= number / i

答案 1 :(得分:0)

您使用0作为%运算符的第二个操作数(N3337 5.6乘法运算符,第4段)来调用未定义的行为,这似乎使程序崩溃。你应该从1开始迭代,而不是0。

另一个注意事项是,1或更小的整数不是素数,因此它们应该在循环之前被拒绝。