C 求第10000个素数
这是我查找第10000个素数的代码,但它非常慢,计算需要7秒C 求第10000个素数,c,C,这是我查找第10000个素数的代码,但它非常慢,计算需要7秒 #include <stdio.h> #include <stdlib.h> long int prime (int n) { int i; for(i=2;i<n;i++) { if(n%i==0) return 0; } return 1; } int main() { int i=2,counter=0; w
#include <stdio.h>
#include <stdlib.h>
long int prime (int n)
{
int i;
for(i=2;i<n;i++)
{
if(n%i==0)
return 0;
}
return 1;
}
int main()
{
int i=2,counter=0;
while(1)
{
if(prime(i))
counter++;
if(counter==10000)
break;
i++;
}
printf("10000th prime number is: %d",i);
}
#包括
#包括
长整数素数(整数n)
{
int i;
为了(i=2;i稍微优化一下代码(根据注释进行更改):
long int prime(int n)
{
int i;
int e=(int)sqrt(n);
对于(i=2;i您可以通过对prime()
进行以下更改来大幅缩短时间:
停在sqrt(n)
从i=3
开始,然后以2
递增i
这是一个包含两个版本和每个版本所用时间的程序
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <math.h>
int is_prime1 (int n)
{
int i;
for(i=2;i<n;i++)
{
if(n%i==0)
return 0;
}
return 1;
}
void do_it1(int max)
{
clock_t start = clock();
clock_t end;
int i=2,counter=0;
while(1)
{
if(is_prime1(i))
counter++;
if(counter==max)
break;
i++;
}
end = clock();
printf("%dth prime number is: %d\n", max, i);
printf("Time taken: %lf\n", 1.0*(end-start)/CLOCKS_PER_SEC);
}
int is_prime2 (int n)
{
int i;
int stop = sqrt(n);
for(i=3;i<=stop;i+=2)
{
if(n%i==0)
return 0;
}
return 1;
}
void do_it2(int max)
{
clock_t start = clock();
clock_t end;
int i=3,counter=1;
while(1)
{
if(is_prime2(i))
counter++;
if(counter==max)
break;
i += 2;
}
end = clock();
printf("%dth prime number is: %d\n", max, i);
printf("Time taken: %lf\n", 1.0*(end-start)/CLOCKS_PER_SEC);
}
int main(int argc, char** argv)
{
int max = atoi(argv[1]);
do_it1(max);
do_it2(max);
}
样本输出:
10000th prime number is: 104729
Time taken: 9.469000
10000th prime number is: 104729
Time taken: 0.078000
#包括
#包括
#包括
整数*素数;
整数素数;
无效生成素数表(整数n){
prime=malloc(sizeof(int)*n/2);
素数n=0;
素数[prime_n++]=2;
素数[prime_n++]=3;
int i,j;
对于(i=5;i)
打破
如果(i%t==0){
is_prime=false;
打破
}
}
if(is_素数)
prime[prime_n++]=i;
}
}
内部主(空){
int n=105000;
制作素数表(n);
如果(素数>=10000)
printf(“第10000个质数是:%d\n”,质数[9999]);
免费(优质);
返回0;
}
你的prime()
函数从2运行到n
,但实际上你只需要检查从2到sqrt(n)
你也只需要测试奇数。也许你可以看看这个链接。这很快:put(“第10000个质数是:104729”)
您可以忽略2
。从i=3开始;
并通过2
增加i
,以减少一半的比较。-1.您还破坏了代码。sqrt(n)
可以是一个主要因素。此外,使用for(int i=2,e=sqrt(n);i
./test 10000
10000th prime number is: 104729
Time taken: 9.469000
10000th prime number is: 104729
Time taken: 0.078000
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int *prime;
int prime_n;
void make_prime_table(int n){
prime = malloc(sizeof(int) * n / 2);
prime_n =0;
prime[prime_n++] = 2;
prime[prime_n++] = 3;
int i, j;
for(i = 5; i <= n; i +=2){
bool is_prime = true;
for(j = 1; j < prime_n ; ++j){
int t = prime[j];
if(t * t > i)
break;
if(i % t == 0){
is_prime = false;
break;
}
}
if(is_prime)
prime[prime_n++] = i;
}
}
int main(void){
int n = 105000;
make_prime_table(n);
if(prime_n >= 10000)
printf("10000th prime number is: %d\n", prime[9999]);
free(prime);
return 0;
}