稍微改变bool素数函数
Slight change to bool prime function
前一段时间我得到了一个关于如何编码bool函数来检查一个数字是否是素数的问题的答案:素数的bool函数。
从这里开始,有效的代码是
bool prime(int x)
{
if (x < 2) return false;
for(int i=2; i<= sqrt(x); i++) {
if ((x%i) == 0) return false;
}
return true;
}
但是如果我把代码改成
bool prime(int x)
{
if (x < 2) return false;
for(int i=2; i<= sqrt(x); i++) {
if ((x%i) != 0) return true;
}
return false;
}
对于许多整数,它不能正确地判断一个数是否是素数。我本以为这两段代码是等价的。有没有办法使这个bool prime
函数与!=
一起工作?
谢谢。
No。当测试一个数字是否是素数时,你知道它不是只要你找到一个因数。
这就是为什么您可以在第一个示例中提前跳出for循环并返回false的原因:
if ((x%i) == 0) return false;
发现任何单个数字不是因数并不能证明一个数字是素数或非素数,因此在该条件下不能提前终止。
不,不可能。
这段原始代码在发现因子时提前返回。修改后的版本在发现为因子时提前返回。因为你必须测试所有可能的因子(至少是小于平方根的因子)才能确定这个数不是素数,所以你提出的方法是行不通的。
另一方面,一个小小的改变可以使算法的效率提高近一倍。因为我们不需要测试任何大于2的偶数,所以我们可以先测试2,然后以3开始循环并递增2s:
bool prime(int x)
{
if (x < 2) return false;
if (x%2 == 0) return x == 2;
for(int i=3; i<= sqrt(x); i+=2) {
if ((x%i) == 0) return false;
}
return true;
}
相关文章:
- 使用 bool 和 const char 重载的 C++ 函数会在没有警告的情况下产生歧义 (MSVC2012)
- 合并 2 个排序的链表。必需的成员函数 bool Merge(List342 &list1):
- C bool表达式作为函数参数调用错误的超载
- 将 std::vector<bool> 传递给外部函数
- 尝试创建一个评估字符的bool函数,如果字母数字为字母,则返回true
- 引用 std::atomic <bool>的已删除函数错误
- bool值不在腔函数函数中重新调整false,c
- 在矩阵C 中使用Bool函数检查重复数字
- 当Bool值在UPDATE()方法中更改时,只有一次呼叫函数
- 我的bool函数一直返回true,我不知道为什么
- 返回 std::p air<const CustomClass &, bool> 用于搜索函数中的失败情况,当 CustomClass 是抽象基类时
- C++变体用bool转换构造函数
- 使用 Bool 函数在 C++ 中进行递归二叉搜索
- 为什么带有Bool参数的函数接受String
- 如何存储CUDA内核函数的Bool结果
- 为什么函数向bool存在隐式转换
- 用bool函数确定末端
- 带有 bool 参数的构造函数总是用 _T( "..." )调用?
- c++中函数bool isnan(…)的定点实现
- 如何为 std::vector<std::vector 编写哈希函数<bool>>