私はこの問題http://www.urionlinejudge.com.br/judge/problems/view/1032を理解しようとしています.1から3501までの素数を最速の方法で見つける必要があります. 1 秒を超えます。
これらの素数を計算する方法は、平方根まで素数であるかどうかを確認し、最初の素数 [2, 3, 5, 7] の倍数を削除して、アルゴリズムのパフォーマンスを向上させることです。それでも時は過ぎていく。
私のコード (提出システムの内部テストとして 1.560 秒かかります)
#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;
}