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

Function used to define whether a number is prime or not causes c++ program to crash

我已经尝试创建这个程序几个小时了,但已经到了完全难倒的地步。我在代码块中使用 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;
}

这可能有些愚蠢,但我只是编程新手

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

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

另外需要注意的是,小于或等于1的整数不是质数,因此在循环之前应该被拒绝。