我目前正在第一次学习c ++,并且我编写了一个cpp bool函数来查找整数是否为素数。
代码是:
bool isPrime(int n) {
for (int i = 2; i < n; i++) {
if (n % i == 0)
return false;
else
return true;
}
}
然而,事实证明9也被认为是具有此功能的素数。
我通过删除else语句
找到了解决方案bool isPrime(int n) {
for (int i = 2; i < n; i++) {
if (n % i == 0)
return false;
}
}
但我仍然不明白为什么else语句首先与它有关。任何人都可以帮助我吗?
答案 0 :(得分:1)
由于if
声明。
if (n % i == 0)
return false;
else
return true;
条件为&#34;如果n
可被当前数字&#34;整除;条件将为真(在这种情况下n
不是素数)或false(可能为素数),因此必须采用其中一个分支,并且在任何一种情况下函数都将退出,可能是过早的。
删除else
会阻止提前返回,但是,它也会阻止该函数返回true
。您只需将return true
添加到函数末尾即可:
bool isPrime(int n) {
for (int i = 2; i < n; i++) {
if (n % i == 0)
return false;
}
return true; // must be prime
}
答案 1 :(得分:1)
因为它将在第一个循环中返回! 当函数进入else时,它将返回true。 任何奇数都将返回true - 9是第一个大于1的奇数,而不是素数。
试试这个:
bool isPrime(int n) {
for (int i = 2; i < n; i++) {
if (n % i == 0)
return false;
else
continue;
}
return true;
}
答案 2 :(得分:1)
数字是素数的唯一方法是循环完成时,因此return true;
语句应该在循环之外。您只需检查最多n
的平方根的数字。
此外,您需要处理n
小于2的情况。
#include <cmath>
bool isPrime(int n)
{
if (n < 2)
{
return false;
}
for (int i = 2; i <= sqrt(n); i++)
{
if (n % i == 0)
{
return false;
}
}
return true;
}
答案 3 :(得分:0)
9很奇怪。这意味着它不能被2整除。实际上它是1之后的第一个奇数,而不是素数。如果n不能被2整除,则代码显式返回true。
for (int i = 2; i < n; i++) {
if (n % i == 0)
return false;
else
return true;
}
for循环第一次运行时,i
为2. n % i == 0
为真或为假。如果为true,则函数立即返回false。如果为false,则函数立即返回true。
您需要在循环外移动return true
语句。只有在通过完成for循环检查所有可能的除数后才知道数字n
是否为素数。