• 试除法求最小N个素数之二


    Trial division

    试除法求最小N个素数是一个经典的算法

    这个算法不同于前一个版本《试除法求最小N个素数》的方法,也是一个比较快速的方法。

    这个算法考虑以下两点:

    1.偶数中只有2是素数,其他素数是奇数;

    2.试除法中,对于数n,只需要对使用小于sqrt(n)的素数试除即可,n只需要用3,5,7,...,进行试探。并且只需要用已知的素数作为除数即可。

    程序中,利用已经知道的素数去试除,处理速度上自然就快。开始时,将2和3放入已经求得的素数数组中是必要的。函数isprime()只需要考虑对奇数进行判定即可,所以用从3开始的奇素数试除。

    程序如下:

    /* 试除法计算最小的N个素数 */
    
    #include <stdio.h>
    #include <math.h>
    
    #define N 132
    
    #define TRUE 1
    #define FALSE 0
    
    typedef unsigned long long ULL;
    
    ULL prime[N+1] = {2, 3};
    
    int isprime(ULL prime[], int n)
    {
        ULL end = (ULL)sqrt(n);
        int i;
        for(i=1; prime[i]<=end; i++)
            if(n % prime[i] == 0)
                return FALSE;
        return TRUE;
    }
    
    void genprime(ULL prime[], int n)
    {
        int k = 2;
        for(int i=5; k<n; i+=2)
            if(isprime(prime, i))
                prime[k++] = i;
    }
    
    int main(void)
    {
        genprime(prime, N);
    
        for(int i=0; i<N; i++)
            printf("%lld
    ", prime[i]);
    
        return 0;
    }
    计算结果如下:

    2
    3
    5
    7
    11
    13
    17
    19
    23
    29
    31
    37
    41
    43
    47
    53
    59
    61
    67
    71
    73
    79
    83
    89
    97
    101
    103
    107
    109
    113
    127
    131
    137
    139
    149
    151
    157
    163
    167
    173
    179
    181
    191
    193
    197
    199
    211
    223
    227
    229
    233
    239
    241
    251
    257
    263
    269
    271
    277
    281
    283
    293
    307
    311
    313
    317
    331
    337
    347
    349
    353
    359
    367
    373
    379
    383
    389
    397
    401
    409
    419
    421
    431
    433
    439
    443
    449
    457
    461
    463
    467
    479
    487
    491
    499
    503
    509
    521
    523
    541
    547
    557
    563
    569
    571
    577
    587
    593
    599
    601
    607
    613
    617
    619
    631
    641
    643
    647
    653
    659
    661
    673
    677
    683
    691
    701
    709
    719
    727
    733
    739
    743


  • 相关阅读:
    委托,匿名方法,Lambda,泛型委托,表达式树
    Winform 异步调用一个方法
    计算两个经纬度的直线距离
    多线程中线程同步的几种方式
    音频文件相关
    c# 语音(二)文字生成WAV文件
    c# 语音
    三种创建委托的方式
    RunLoop 再次 探索与源码简析
    SDWebImage 实现原理与源码简析
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564287.html
Copyright © 2020-2023  润新知