大量数据(几亿)里筛素数

Posted RenewDo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大量数据(几亿)里筛素数相关的知识,希望对你有一定的参考价值。

原理:首先利用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;(i<pi)&&(i*primes[j]<MAX);j++)
                  {
                     flag[i*primes[j]]=true;
                     if(i%primes[j]==0)
                         break;
                  }
           }
    }

 

以上是关于大量数据(几亿)里筛素数的主要内容,如果未能解决你的问题,请参考以下文章

用 C 语言编写一个程序,该程序使用递归来确定一个数字是不是为素数。大量出现堆栈溢出错误

线性筛素数详细整理

懂ABAP的来,非常基础,怎样定义一个大金额数据类型呢,可以上好几亿

布隆过滤器,我也是个处理过十几亿数据的人儿

片段加载数据太慢

在c中使用递归找到最大的素数