数学知识1

本文探讨了质数的判定与分解质因数的方法,包括试除法和筛法。通过试除法判断质数的时间复杂度为O(sqrt(n)),而分解质因数的时间复杂度在O(logn)到O(sqrt(n))之间。朴素筛法和线性筛法用于高效求解素数,时间复杂度分别为O(nloglogn)。同时,介绍了如何使用试除法获取一个数的所有约数以及计算约数个数和约数之和的公式。
摘要由CSDN通过智能技术生成

1、质数:在大于1的整数中,如果只包含1和本身这两个约数,就被称为质数,或者叫素数。

(1)试除法——质数的判定 :(时间复杂度O(sqrt(n)))

bool is_prime(int x)
{
    if (x < 2) return false;
    for (int i = 2; i <= x / i; i ++ )
        if (x % i == 0)
            return false;
    return true;
}

(2)试除法——分解质因数(n中最多只包含一个大于sqrt(n)的质因子)

(时间复杂度O(logn)~O(sqrt(n))

void divide(int x)
{
    for (int i = 2; i <= x / i; i ++ )
        if (x % i == 0)	//i 一定是质数
        {
            int s = 0;
            while (x % i == 0) x /= i, s ++ ;
            cout << i << ' ' << s << endl;
        }
    if (x > 1) cout << x << ' ' << 1 << endl;
    cout << endl;
}

朴素筛法求素数 (时间复杂度O(nloglogn))

int primes[N], cnt;     // primes[]存储所有素数
bool st[N];         // st[x]存储x是否被筛掉

void get_primes(int n)
{
    for (int i = 2; i <= n; i ++ )
    {
        if (st[i]) continue;
        primes[cnt ++ ] = i;
        for (int j = i + i; j <= n; j += i)
            st[j] = true;
    }
}

线性筛法求素数

int primes[N], cnt;     // primes[]存储所有素数
bool st[N];         // st[x]存储x是否被筛掉

void get_primes(int n)
{
    for (int i = 2; i <= n; i ++ )
    {
        if (!st[i]) primes[cnt ++ ] = i;
        for (int j = 0; primes[j] <= n / i; j ++ )
        {
            st[primes[j] * i] = true;
            if (i % primes[j] == 0) break;//primes[j]一定是i的最小质因子
        }
    }
}

分析:

1.i%pj==0
pj一定是i的最小质因子,pj一定是pj*i的最小质因子
2.i%pj!= 0
pj一定小于i的所有质因子,pj也一定是pj*i的最小质因子

2、约数:

(1)试除法求一个数的所有约数

vector<int> get_divisors(int x)
{
    vector<int> res;
    for (int i = 1; i <= x / i; i ++ )
        if (x % i == 0)
        {
            res.push_back(i);
            if (i != x / i) res.push_back(x / i);
        }
    sort(res.begin(), res.end());
    return res;
}

约数个数和约数之和:

如果 N = p1^c1 * p2^c2 * … *pk^ck

约数个数: (c1 + 1) * (c2 + 1) * … * (ck + 1)

约数之和: (p1^0 + p1^1 + … + p1^c1) * … * (pk^0 + pk^1 + … + pk^ck)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不能say的秘密

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值