【发布时间】:2015-06-02 00:26:32
【问题描述】:
这是我要解决的问题的链接:http://acm.timus.ru/problem.aspx?space=1&num=1086
这是我的方法:
#include <stdio.h>
#include <math.h>
int main()
{
int n, i, m, p;
scanf("%d", &n);
for(i = 0; i < n; i++)
{
scanf("%d", &m);
p = find_prime(m);
printf("%d\n", p);
}
return 0;
}
int find_prime(int a)
{
int i, p = 1, t, prime[15000], j;
prime[0] = 2;
for(i = 0; i < a; )
{
if(p == 2)
{
p++;
}else
{
p = p + 1;
}
t = 0;
for(j = 0; prime[j] <= sqrt(p); j++)
{
if(p%prime[j] == 0 && p != 2)
{
t = 1;
break;
}
}
if(t != 1)
{
i++;
prime[i] = p;
}
}
return p;
}
我知道算法很好,它会产生正确的答案。但我总是得到“超过时间限制”。我无法将运行时下载到 2 秒。它始终等于 2.031 秒。我尝试了一些其他方法,例如,我遍历所有数字,直到找到第 m 个素数,我尝试跳过大于 2 的偶数,但我仍然得到 2.031 秒。
我该怎么办?
【问题讨论】:
-
您可以使用sieve of Erastosthenes。
-
您认为
if(p == 2) { p++; }else { p = p + 1; }的两个分支之间的行为差异是什么?对我来说,看起来好像p增加了 1,而不管其初始值如何。 —— 而且我看到Ed Heal 在他的not really an answer 中指出了这一点。 -
由于等待用户输入一些数字序列是海量的,时间上,与实际执行相比似乎不切实际,将注意力集中在 find_prime() 函数的执行时间上
-
在调用 scanf()(或任何该系列函数)时,代码应始终检查返回值(而不是参数值)以确保操作成功
标签: c algorithm primes number-theory