c++ - 如何以更有效的方式检查数字是否为素数?

标签 c++ primes

所以我有以下问题。他们给了我一个有数字的数组,如果它包含任何素数,我必须使用“Divide et Impera”打印出来。我解决了这个问题,但它只得到 70/100,因为它效率不高(他们说)。

#include <iostream>
using namespace std;

bool isPrime(int x){
   if(x == 2) return false;
   for(int i = 2; i <= x/2; ++i)
      if(x%i==0) return false;
   return true;

}

int existaP(int a[], int li, int ls){
    if(li==ls)
       if(isPrime(a[li]) == true) return 1;
       else return 0;
    else  return existaP(a, li, (li+ls)/2)+existaP(a, (li+ls)/2+1, ls);      
}

int main(){
   int n, a[10001];
   cin >> n;
   for(int i = 1; i<=n; ++i) cin >> a[i];
   if(existaP(a,1,n) >= 1) cout << "Y";
   else cout << "N";
   return 0;
}

最佳答案

这里最容易挂的果子是你的停止条件

i <= x/2

可以替换为

i * i <= x

注意确保您不会溢出 int .这是因为你只需要去到x的平方根,而不是半途而废。也许i <= x / i更好的是避免溢出;尽管以在某些平台上成本相对较高的部门为代价。

您的算法对于 x == 2 也有缺陷因为你有不正确的返回值。如果你放弃那个额外的测试会更好,因为随后的循环会覆盖它。

关于c++ - 如何以更有效的方式检查数字是否为素数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50930926/

相关文章:

php - 如何开始用 C++ 编写 PHP5 扩展

c++ - 反平方根内在函数

c++ - 制作大表时程序停止工作(2'000' 000+)

python - Python素数检查

c# - 通过限制迭代次数判断一个数是否为素数-c#

prolog - Prolog 中的不同素数分区

c++ - 没有辅助变量的 std::vector 中的 Pushing_back 值

c++ - 在 C++ 中为字符串指针的动态数组寻找一个简单的包装器

c++ - 从 char 到 const* char 的无效转换,代码有什么问题?

Javascript 对素数求和崩溃