先用筛法求素数的方法打表, 然后再进行查找, 哈哈, 这是第一个排名第三的程序呀!
筛法求素数参考了找质数算法(Sieve of Eratosthenes筛法), 这里有说明了筛法求素数的原理, 非常不错!
PRIME
/*
function isPrime(x: integer): boolean;
var i: integer;
begin
i:=1;
while list[i]*list[i]<=x do begin
if x mod list[i]=0 then begin
result:=false;
exit;
end;
inc(i);
end;
result:=true;
end;
*/
#include < stdio.h >
#include < math.h >
#define MAXLEN 110010
int isPrime[MAXLEN];
int prime[ 10000 ];
void sieve( int arr[], int len)
{
int i, j;
int sqrt_len = sqrt(len);
for (i = 2 ; i < len; i ++ )
arr[i] = 1 ;
for (i = 2 ; i < sqrt_len; i ++ )
{
if (arr[i])
{
for (j = i; j * i <= len; j ++ )
arr[j * i] = 0 ;
}
}
int cnt = 0 ;
prime[ 0 ] = 1 ;
for (i = 2 ; i < len; i ++ )
{
if (arr[i] == 1 )
{
prime[ ++ cnt] = i;
if (cnt == 10000 )
break ;
}
}
}
int main()
{
sieve(isPrime, MAXLEN);
int n;
scanf( " %d " , & n);
printf( " %d\n " , prime[n]);
return 0 ;
}
var i: integer;
begin
i:=1;
while list[i]*list[i]<=x do begin
if x mod list[i]=0 then begin
result:=false;
exit;
end;
inc(i);
end;
result:=true;
end;
*/
#include < stdio.h >
#include < math.h >
#define MAXLEN 110010
int isPrime[MAXLEN];
int prime[ 10000 ];
void sieve( int arr[], int len)
{
int i, j;
int sqrt_len = sqrt(len);
for (i = 2 ; i < len; i ++ )
arr[i] = 1 ;
for (i = 2 ; i < sqrt_len; i ++ )
{
if (arr[i])
{
for (j = i; j * i <= len; j ++ )
arr[j * i] = 0 ;
}
}
int cnt = 0 ;
prime[ 0 ] = 1 ;
for (i = 2 ; i < len; i ++ )
{
if (arr[i] == 1 )
{
prime[ ++ cnt] = i;
if (cnt == 10000 )
break ;
}
}
}
int main()
{
sieve(isPrime, MAXLEN);
int n;
scanf( " %d " , & n);
printf( " %d\n " , prime[n]);
return 0 ;
}