这里是我尝试解决的问题链接:http://acm.timus.ru/problem.aspx?space=1&num=1086
我的方法如下:
我知道算法没问题,它能够得出正确的答案。但是我总是遇到“超时”错误。我无法将运行时间缩短到2秒以内,它总是等于2.031秒。我尝试了其他几种方法,例如,我遍历所有数字直到找到第m个质数,我尝试跳过大于2的偶数,但我仍然会得到2.031秒的运行时间。
我该怎么办?
#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秒的运行时间。
我该怎么办?
if(p == 2) { p++; } else { p = p + 1; }
的两个分支之间的行为差异是什么?在我看来,无论其初始值如何,p
都会增加一。而且我注意到 Ed Heal 在他的 不算答案的回答 中指出了这一点。 - Jonathan Leffler