gpt4 book ai didi

c - 帮助使此代码针对 SPOJ 运行得更快

转载 作者:太空宇宙 更新时间:2023-11-04 07:42:01 24 4
gpt4 key购买 nike

我一直在做一些关于 Sphere Online Judge 的挑战(SPOJ),但我似乎无法获得 the second problem (主发电机)在时限内运行。如何提高以下代码的速度?

#include <stdio.h>
#include <math.h>

int is_prime(int n);
void make_sieve();
void fast_prime(int n);

int primes[16000];

int main()
{
int nlines;
int m, n;
make_sieve();
scanf("%d", &nlines);
for (; nlines >= 1; nlines--) {
scanf("%d %d", &m, &n);
if (!(m % 2)) {
m++;
}
for ( ; m < n; m+=2) {
fast_prime(m);
}
printf("\n");
}
return 0;
}

/* Prints a number if it's prime. */
inline void fast_prime(int n)
{
int j;
for (int i = 0; ((j = primes[i]) > -1); i++) {
if (!(n % j)) {
return;
}
}
printf("%d\n", n);
}

/* Create an array listing prime numbers. */
void make_sieve()
{
int j = 0;
for (int i = 0; i < 16000; i++) {
primes[i] = -1;
}
for (int i = 2; i < 32000; i++) {
if (i % 2) {
if (is_prime(i)) {
primes[j] = i;
j++;
}
}
}
return;
}

/* Test if a number is prime. Return 1 if prime. Return 0 if not. */
int is_prime(int n)
{
int rootofn;
rootofn = sqrt(n);
if ((n <= 2) || (n == 3) || (n == 5) || (n == 7)) {
return 1;
}
if (((n % 2) == 0) || ((n % 3) == 0) || ((n % 5) == 0) || ((n % 7) == 0)) {
return 0;
}
for (int i = 11; i < rootofn; i += 2) {
if ((n % i) == 0) {
return 0;
}
}
return 1;
}

最佳答案

isprime() 不使用素数表 primes[]。

另外,使用二进制搜索算法实现对素数数组的搜索,该搜索将快速完成。标准库有一个。

要查看您的时间花费在代码中的什么地方,您可以使用分析gcc 示例

gcc -p -g - o mycode mycode.c
===run the code--
gprof mycode

关于c - 帮助使此代码针对 SPOJ 运行得更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2933957/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com