wojiaocbj

primetable

Apr 27th, 2022
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.33 KB | None | 0 0
  1. int primes[10000010] = {0};//primes[0]计数
  2. int vis[10000010] = {0};
  3. void initprimes(int *primetable,int *visit,int n){
  4.     /*
  5.     *
  6.     *
  7.     * 质数表放到primetable vis是辅助数组,这两个数组至少有n+2的长度且被置0
  8.     *
  9.     *
  10.     *
  11.     欧拉筛法 O(n)造质数表
  12.     在埃氏筛法的基础上,让每个合数只被它的最小质因子筛选一次,以达到不重复的目的。
  13.    
  14.     对于 i%prime[j] == 0 就break的解释 :当 i是prime[j]的倍数时,i = kprime[j],如果继续运算 j+1,i * prime[j+1] = prime[j] * k prime[j+1],这里prime[j]是最小的素因子,当i = k * prime[j+1]时会重复,所以才跳出循环。举个例子 :i = 8 ,j = 1,prime[j] = 2,如果不跳出循环,prime[j+1] = 3,8 * 3 = 2 * 4 * 3 = 2 * 12,在i = 12时会计算。因为欧拉筛法的原理便是通过最小素因子来消除。
  15.     对于visit[i*prime[j]] = 1 的解释: 这里不是用i的倍数来消去合数,而是把 prime里面纪录的素数,升序来当做要消去合数的最小素因子。
  16.     原文链接:https://blog.csdn.net/qq_39763472/article/details/82428602
  17.     */
  18.     int i,j;
  19.     for(i = 2;i <= n;i++){
  20.         if(!visit[i]){
  21.             primetable[++primetable[0]] = i;
  22.         }
  23.         for(j = 1;j <= primetable[0] && i * primetable[j] <= n;j++){
  24.             vis[i * primes[j]] = 1;
  25.             if(i % primes[j] == 0)break;
  26.         }
  27.     }
  28. }
Advertisement
Add Comment
Please, Sign In to add comment