我必须打印两个限制之间的数字n
and m
, t
times.
我创建t
变量和两个指针n, m
指向保留的内存块t
整数值。
我使用指针而不是数组来执行更快的操作。
Outer for
循环迭代每个测试用例并增加m
and n
指针。
Inner for
循环打印素数m[i]
to n[i]
.
Code
#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 上提交此代码时,出现“超出时间限制”错误。如何减少这个素数生成器的执行时间?
正如@Carcigenicate 所建议的,您超出了时间限制,因为您的素数生成器太慢了;而且它太慢了,因为你使用的是低效的算法。
事实上,您不应该简单地测试每个连续数字的素数(顺便说一句,您这样做也是无效的),而应该使用已知的素数(也许还有您计算的其他素数)一次排除多个值。例如,您不需要检查 5 和 10 的倍数(实际值 5 除外)的素数,因为您知道 5 能整除它们。因此,只需将各种素数的倍数“标记”为不相关即可。
...当然,这只是为了让您开始,您可以使用各种技巧来优化 - 算法和与实现相关的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)