zoukankan      html  css  js  c++  java
  • 大量数据(几亿)里筛素数

    原理:首先利用C的底层函数memset将整个数据一开始都置为素数。

    然后开始考虑,一般来说素数的倍数肯定是合数了,所以我们可以用素数乘以其他整数来置部分数据为合数,其余数据则是素数。

    但这样有个问题:重复计算太多,对于数据量很大,这种做法不可取。

           具体那些重复了呢:当数为9时,用9乘以素数2;当数为6时,6乘以素数3;因此18被重复计算了。

           为什么呢?因为我们采用的是当前的数会去乘以所有比它小的素数。

                          改进做法:9*2与6*3,我们取9*2。我们发现6是3的倍数,对于这种情况会经常重复计算,所以我们需要避免这种情况,可以当发现当前循环的数已是某个素数的倍数时,那么后面的素数可以都不用再和它相乘了。

    const int MAX=100;
    bool flag[MAX];
    int primes[MAX/3],pi;
    void GetPrimes()
        {
           int i,j;
           pi=0;
           memset(flag,false,sizeof(flag));
           for(i=2;i<MAX;i++)
               {
                  if(!flag[i])
                      primes[pi++]=i;
                  for(j=0;(j<pi)&&(i*primes[j]<MAX);j++)
                      {
                         flag[i*primes[j]]=true;
                         if(i%primes[j]==0)
                             break;
                      }
               }
        }
  • 相关阅读:
    R中seurat等问题学习
    主成分分析PCA学习一条龙
    PAT 1116 Come on! Let's C [简单]
    PAT 1077 Kuchiguse [一般]
    R中的一些基础1106
    PAT 1036 Boys vs Girls[简单]
    稳定婚姻匹配问题模板
    University Entrace Examination zoj1023
    Stable Match
    7-1 玩转二叉树
  • 原文地址:https://www.cnblogs.com/daocaorenblog/p/5264348.html
Copyright © 2011-2022 走看看