- 已关闭**。此问题需要details or clarity。当前不接受答案。
- 想要改进此问题?**添加详细信息并通过editing this post阐明问题。
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;
}
1条答案
按热度按时间lsmepo6l1#
看看时间复杂度是否可以降低。
这是一个有价值的目标 * 后 * 得到功能正确。
is_prime(2147483647)
返回0,但仍是质数。这是由于
i * i <= n
中的溢出。n = INT_MAX
时出现无限循环。要修复:is_prime(-1)
、is_prime(-2147483647)
和各种负值返回1,但不是质数。修补代码
溢出
使用
int sum
时,sum += j;
很容易溢出。请使用long long sum
。要使用这段检查连续整数集的素数的代码提高时间性能,请研究Sieve of Eratosthenes。
这实际上是对OP的重写,但它具有更快的执行时间。