用于定义一个数是否为素数的函数导致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++) {
...
此外,您不需要检查从 1
到 number
的所有数字来确保 number
是素数。一旦找到第一个除数,您就可以确定 number
不是质数。如果从 1
到 sqrt(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的整数不是质数,因此在循环之前应该被拒绝。
我已经尝试创建这个程序几个小时了,但已经到了完全难倒的地步。我在代码块中使用 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++) {
...
此外,您不需要检查从 1
到 number
的所有数字来确保 number
是素数。一旦找到第一个除数,您就可以确定 number
不是质数。如果从 1
到 sqrt(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的整数不是质数,因此在循环之前应该被拒绝。