【问题标题】:c++ function to check if a number is a prime [closed]c ++函数来检查一个数字是否是素数[关闭]
【发布时间】:2022-01-29 14:26:34
【问题描述】:
bool prime (long long int n) {
    bool prime = 1;
    if (n == 1) {
        return 0;
    }
    else {
        for (long long int i = 2; i <= n/2 ; i++) {
            if (n % i == 0) {
                prime = 0;
                break ;
            }
            
        }
        return prime;
    }
}

这是我检查n 是否为素数的函数。直到我尝试使用 12 位数字(例如 n = 999999999989)之前它都有效。

这是给problem on codeforces;当我提交此功能时,网站会打印“超出时间限制”。

【问题讨论】:

标签: c++ primes time-limiting


【解决方案1】:

您的代码的时间复杂度是 O(n/2) -> O(n)。 如果 n 为 10^12,则检查 n 的素数大约需要 10000 秒(假设 1 秒只能进行大约 10^8 次操作)。

for (long long int i = 2; i <= n/2 ; i++) {
    if (n % i == 0) {
        prime = 0;
        break ;
}

这里的诀窍是您不需要检查 i 从 2 到 n/2。相反,您可以将其从 2 减少到 sqrt(n)。这是因为 sqrt(n) * sqrt(n) 是 n,所以不应该有任何 x 和 y,因此 x > sqrt(n); y > sqrt(n); x*y = n。因此,如果 n 的除数存在,它应该是

所以你应该把你的循环改成这个

for (long long int i = 2; i*i <= n ; i++) {
    if (n % i == 0) {
        prime = 0;
        break ;
    }
}

这段代码的时间复杂度是 O(sqrt(n)) 应该足够 n = 10^12。

P.S : sqrt(n) 表示 n 的平方根

【讨论】:

  • 偶数(2除外)不需要检查
  • @AlanBirtles 实际上你只需要检查素数。 (这可以通过一些递归来安排。)有些人质疑跳过偶数的纯度 - 因为你有点“硬编码”。
  • 请注意,i &lt;= n / i 是编写停止条件的更好方法,因为它避免了整数类型的潜在溢出。不错的答案。投赞成票。
  • @AlanBirtles 你是对的。但我认为它对时间复杂度的影响并不大
  • @Bathsheba 是的,你也说得对,谢谢你的建议。
猜你喜欢
  • 2015-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
相关资源
最近更新 更多