我一直试图创建这个程序好几个小时,并且已经到了我完全被难过的地步。我在代码块中使用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;
}
它可能是一些愚蠢的东西,但我只是编程的新手
答案 0 :(得分:2)
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
答案 1 :(得分:0)
您使用0作为%
运算符的第二个操作数(N3337 5.6乘法运算符,第4段)来调用未定义的行为,这似乎使程序崩溃。你应该从1开始迭代,而不是0。
另一个注意事项是,1或更小的整数不是素数,因此它们应该在循环之前被拒绝。