【C++后台开发面经】面试总结第九波:笔试算法经典模板

前言

     面试总结第九波,总结在笔试中会经常用到的算法模板,有助于笔试。

经典模板

目录

前言

经典模板

1、求n以内的所有素数

2、计算n包含几个质数p

3、计算n!

4、快速幂

5、求最大公约数

6、KMP模板

7、并查集


1、求n以内的所有素数

//获取n以内的质数,保存到primes中
void get_primes(vector &primes,int n) {
	vector st(n+1); //注意这里是n+1
	for (int i = 2; i<= n; i++) {
		if (!st[i]) {
			primes.push_back(i);
			for (int j = i * 2; j <= n; j += i) { //把i的倍数都去掉
				st[j] = true;
			}
		}
	}
}

2、计算n包含几个质数p

//得到n包含几个质数p
int get_exp(int n, int p) {
	int res = 0;
	while (n > 0) {
		res += n / p;
		n /= p;
	}
	return res;
}

3、计算n!

//计算n的阶乘
int get_n(int n) {
	vector primes;
	get_primes(primes, n); //先得到n以内的素数

	vector exps;
	for (int i = 0; i < primes.size(); i++) {
		exps.push_back(get_exp(n, primes[i])); //得到n包含每个素数的个数
	}

	//n!=2^e1+3^e2+5^e3+...
	int res = 1;
	for (int i = 0; i < exps.size(); i++) {
		while (exps[i]--) {
			res = (long long)res*primes[i] % mod;
		}
	}

	return res;
}

4、快速幂

//计算base^power
int get_power(int base, int power) {
    int result = 1;
    while (power > 0) { //最后的结果就是当指数为奇数时,所有的基数相乘
        if (power & 1) { //power%2==1
            result *= base;
        }
        power >>= 1; //power/2
        base *= base;
    }
    
    return result;
}

5、求最大公约数

//求两个数的最大公约数
int gcd(int a, int b) {
	return b ? gcd(b, a%b) : a;
}

6、KMP模板

const int N=1003;
int nxt[N];
vector> vec;

void Next(string t){
    int i=0,j=-1,n=t.size();
    nxt[0]=-1;
    while(i

7、并查集

struct DSU{
    vector f;
    DSU(int n):f(n){
        for(int i=0;i

 

你可能感兴趣的:(面经)