【发布时间】:2017-07-10 01:47:48
【问题描述】:
我必须打印两个限制 n 和 m、t 次之间的数字。
我创建了t 变量和两个指向t 整数值的保留内存块的指针n, m。
我使用指针而不是数组来执行更快的操作。
外部 for 循环迭代每个测试用例并增加 m 和 n 指针。
内部 for 循环打印从 m[i] 到 n[i] 的素数。
代码
#include <stdio.h>
#include <stdlib.h>
int is_prime(int);
int main(void) {
int t;
int *n = malloc(sizeof(int) * t);
int *m = malloc(sizeof(int) * t);
scanf("%d", &t);
for (int i = 0; i < t; i++, m++, n++) {
scanf("%d %d", &m[i], &n[i]);
for (int j = m[i]; j <= n[i]; j++) {
if (is_prime(j)) {
printf("%d\n", j);
}
}
if (i < t - 1) printf("\n");
}
return 0;
}
int is_prime(int num)
{
if (num <= 1) return 0;
if (num % 2 == 0 && num > 2) return 0;
for(int i = 3; i < num / 2; i+= 2){
if (num % i == 0)
return 0;
}
return 1;
}
问题:http://www.spoj.com/problems/PRIME1/
代码在 http://ideone.com 上正确编译,但是当我尝试在 SPOJ 上提交此代码时出现“超出时间限制”错误。我怎样才能减少这个素数生成器的执行时间?
【问题讨论】:
-
看起来你只是在做蛮力审判除法,这非常慢。查找筛子。关于素数的 Wiki 页面应该提及您的选择。此外,您可以检查所有小于
sqrt(n)的数字,而不是检查所有小于num / 2的数字。如果缓存sqrt(n)的值,应该会更快。 -
另外@Carcigenicate的提示:使用条件
i*i <= num可以完全避免平方根的计算 -
回复:“我没有创建数组而不是指针,因为指针操作更快”:这句话有太多错误,我几乎不知道从哪里开始。 :-/
-
您正在使用未初始化的变量
t来计算数组的大小前你给t赋值。 -
你的代码对我来说真的很奇怪!!!您在使用未初始化变量 (
t) 计算的区域大小上使用malloc。我真的很怀疑:(1)这里真的值得使用malloc(); (2) 它给出了一个安全的最后的结果(请注意,您没有释放分配的内存区域)。