• 数论-筛法素数


    数论的根基,素数

    写在前面:之前的老板子。

    首先贴一个线性筛。O(n)

    #include <iostream>
    #include <cstdio>
    #include <vector> 
    using namespace std;
    
    const int N = 100000 + 5;
    bool prime[N];
    int p[N],tot;//p数组用来存质数
    
    void init(){
    	for(int i = 2; i < N; i++){
    		prime[i] = true;
    	}
    	for(int i = 2; i < N; i++){
    		if(prime[i])
    			p[tot++] = i;
    		for(int j = 0 ; j < tot && i*p[j] < N; j++){
    			prime[i*p[j]] = false;
    			if( i%p[j] == 0 )
    				break;
    		}	
    	} 
    }
    

    是个写烂了的模板。偶然在某个blog上看到了应用

    /*筛法的应用*/ 
    //预处理每个数的所有质因数
    vector<int> prime_factor[N];
    void init1(){
    	for(int i = 2; i < N; i++){
    		if(prime_factor[i].size() == 0){
    			for(int j = i; j < N; j += i){
    				prime_factor[j].push_back(i);
    			}
    		}
    	}
    } 
    
    //预处理每个数的所有因数 
    vector<int> factor[N];
    void init2(){
    	for(int i = 2; i < N; i++){
    		for(int j = i; j < N; j += i){
    			factor[j].push_back(i);
    		}
    	}
    }
    
    //预处理每个数的质因数分解
    vector<int> factor_prime[N];
    void init3(){
    	int temp;
    	for(int i = 2; i < N; i++){
    		if(factor_prime[i].size() == 0){
    			for(int j = i; j < N; j+=i){
    				temp=j;
    				while(temp % i == 0){
    					factor_prime[j].push_back(i);
    					temp /= i;
    				}
    			}
    		}
    	}
    } 
    

    这里就是巩固了一下STL中vector的用法。我是记不太清了。所以刚好复习了一下。

    最后贴个输出

    
    int main(){	
    	init1();
    	for(int i=2; i < N; i++){
    		for(int j=0;j<prime_factor[i].size();j++){
    			cout<<prime_factor[i][j]<<" ";
    		}
    		cout<<endl;
    	}
     
    	return 0;
    } 
    
    
  • 相关阅读:
    C++函数四( 具有默认参数值的函数)
    C++函数三(内联函数和函数重载)
    C++函数二(函数的嵌套调用和递归调用)
    C++关于函数声明定义的位置
    C++函数一(标准库函数,自定义函数)
    C++扑克牌发牌游戏程序(包括C++随机数的解释)
    C++数组二(字符数组)
    C++数组一
    C++程序流程结构
    C++运算符与表达式
  • 原文地址:https://www.cnblogs.com/Asumi/p/8821558.html
Copyright © 2020-2023  润新知