我正在尝试解决这个问题http://www.urionlinejudge.com.br/judge/problems/view/1032,我需要以最快的方式找到 1 到 3501 之间的质数,因为时间限制可能不会超过 1 秒。
我计算这些素数的方法是检查它们是否是素数直到它们的平方根,然后消除第一个素数的倍数 [2, 3, 5, 7] 以提高算法的性能。然而,时间超过了。
我的代码(提交系统内测用了1.560s)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <iostream>
#include <set>
using namespace std;
set<int> circ;
set<int> primes;
/* Calculate List Primes */
void n_prime(int qtd){
int a, flag=1, l_prime = 1;
float n;
for(int i=0;i<qtd;i++){
switch (l_prime){
case 1:
l_prime = 2;
break;
case 2:
l_prime = 3;
break;
default:
while(1){
flag=1;
l_prime+=2;
if(l_prime>7)
while(l_prime%2==0||l_prime%3==0||l_prime%5==0||l_prime%7==0) l_prime++;
n=sqrt(l_prime);
for(a=2;a<=n;a++){
if(l_prime%a==0){
flag=0;
break;
}
}
if(flag) break;
}
}
primes.insert(l_prime);
}
}
/* Initialize set with live's */
void init_circ(int t){
circ.clear();
for(int a=0;a<t;a++){
circ.insert(a+1);
}
}
/* Show last live*/
void show_last(){
for(set<int>::iterator it=circ.begin(); it!=circ.end(); ++it)
cout << *it << "\n";
}
int main(){
int n = 0;
clock_t c1, c2;
c1 = clock();
n_prime(3501);
while(scanf("%d", &n)&&n!=0){
init_circ(n);
int idx=0, l_prime,count = 0;
set<int>::iterator it;
set<int>::iterator np;
np=primes.begin();
for(int i=0;i<n-1;i++){
l_prime=*np;
*np++;
idx = (idx+l_prime-1) % circ.size();
it = circ.begin();
advance(it, idx);
circ.erase(it);
}
show_last();
}
c2 = clock();
printf("\n\nTime: %.3lf", (double)(c2-c1)/CLOCKS_PER_SEC);
return 0;
}