C 求第10000个素数

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

这是我查找第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;
    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;
    }