AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

质数判断&分解质数&质数筛法

作者: 作者的头像   echomingzhu ,  2019-10-19 23:49:53 ,  所有人可见 ,  阅读 1604


7


5

1.核心思想

  1. 质数判断:试除法
  2. 分解质因数:任何一个数 n ,一定能够表示成 n = a0^p0 * a1^p1 * a2^p2 ... ak^pk, 其中 a0,a1,a2...ak都是质数
  3. 质数筛法: 从 2 到 n, 删除每个质数的整数倍,那么剩下的都是质数

3. 代码模板

1. 质数判断
int is_prime(int n)
{
    if(n == 1){
        return 0;
    }

    for(int i = 2; i <= n / i; i++){
        if(n % i == 0){
            return 0;
        }
    }

    return 1;
}

2. 分解质因数
void divide(int n)
{
    for(int i = 2; i <= n / i; i++){
        if(n % i == 0){
            int s = 0;
            while(n % i == 0){
                n = n / i;
                s++;
            }

            printf("%d %d\n", i, s);
        }
    }
    // 注意这个点
    if(n > 1){
        printf("%d %d\n", n, 1);
    }
}

3. 筛法找质数
char st[N];
int get_primes(int n)
{
    int ans = 0;
    for(int i = 2; i <= n; i++){
        if(st[i] == 0){
            ans++;
            for(int j = i + i; j <= n; j = j + i){
                st[j] = 1;
            }
        }
    }

    return ans;
}

4 评论


用户头像
陆修远   2022-07-10 11:17         踩      回复

大佬,请问筛法求质数的时间复杂度是多少?

用户头像
Williams   2022-12-16 21:04      2    踩      回复

sqrt(n)


用户头像
yxc胡建分灿   2020-05-18 16:57         踩      回复

// 注意这个点
if(n > 1){
printf(“%d %d\n”, n, 1);
}

请问这里为什么要判断?

用户头像
jasonlin   2020-08-06 23:21         踩      回复

因为,n中最多只包含一个大于sqrt(n)的质因子 所以单独来处理


App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息