C语言 在数的两边生成素数[闭数]

23c0lvtd  于 2023-02-15  发布在  其他
关注(0)|答案(1)|浏览(128)

2天前关闭。
Improve this question

    • 问题:**

生成一个函数,取一个数x作为参数,另一个数p作为参数,然后取左右两边的p个质数,并返回所有这些元素的平均值。

    • 尝试:**

我写了下面的代码:但我想看看时间复杂度是否可以降低。

#include <stdio.h>

int is_prime(int n)
{
    if (n == 1)
        return 0;
    
    if (n == 2 || n == 3)
        return 1;
    
    if (n % 2 == 0 || n % 3 == 0)
        return 0;
    
    for (int i = 5; i * i <= n; i = i + 6)
    {
        if (n % i == 0 || n % (i + 2) == 0)
            return 0;
    }
    
    return 1;
}

double sum_of_primes(int x, int p)
{
    int sum = 0;
    int countls = 0;
    int countrs = 0;
    int count = 0;

    if (is_prime(x))
    {
        sum = x;
        count = 1;
    }

    int i = x - 1;
    int j = x + 1;
    while (countls < p)
    {
        if (is_prime(i))
        {
            sum += i;
            countls++;
            count++;
        }   
        i--;
    }

    while (countrs < p)
    {  
        if (is_prime(j))
        {
            sum += j;
            countrs++;
            count++;
        }     
        j++;
    }
    return (double)sum / count;
}

int main()
{         
   int x, p;
   scanf("%d %d", &x, &p);

   printf("%f", sum_of_primes(x, p));
   return 0;
}
lsmepo6l

lsmepo6l1#

看看时间复杂度是否可以降低。
这是一个有价值的目标 * 后 * 得到功能正确
is_prime(2147483647)返回0,但仍是质数。
这是由于i * i <= n中的溢出。n = INT_MAX时出现无限循环。要修复:

// for (int i = 5; i * i <= n; i = i + 6) {
for (int i = 5; i <= n/i; i = i + 6) {

is_prime(-1)is_prime(-2147483647)和各种负值返回1,但不是质数。

//if (n == 1)
if (n <= 1)
  return 0;

修补代码

int is_prime(int n) {
  //if (n == 1)
  if (n <= 1)
    return 0;

  if (n == 2 || n == 3)
    return 1;

  if (n % 2 == 0 || n % 3 == 0)
    return 0;

  // for (int i = 5; i * i <= n; i = i + 6) {
  for (int i = 5; i <= n/i; i = i + 6) {
    if (n % i == 0 || n % (i + 2) == 0)
      return 0;
  }

  return 1;
}

溢出

使用int sum时,sum += j;很容易溢出。请使用long long sum
要使用这段检查连续整数集的素数的代码提高时间性能,请研究Sieve of Eratosthenes
这实际上是对OP的重写,但它具有更快的执行时间。

相关问题