美文网首页
质因子分解(素数埃氏筛法)[PAT A1059]

质因子分解(素数埃氏筛法)[PAT A1059]

作者: Fgban | 来源:发表于2020-01-24 11:54 被阅读0次

埃氏筛法原理
质因子分解结论

#include<cstdio>
#include<cmath>
#include<algorithm>

using namespace std;

const int maxn = 100010;
int prime[maxn], pnum = 0;
bool p[maxn] = {0};

//素数筛选-埃氏筛法 
void find_prime(){
    for(int i = 2; i < maxn; i++){
        //如果p[i]未被标记则是素数 
        if(p[i] == false){
            //记录该素数 
            prime[pnum++] = i;
            //将该素数的倍数的数字标记为不是素数 
            for(int j = i + i; j < maxn; j += i)
                p[j] = true;
        }
    }
} 

//质因子定义 
struct factor{
    int x;
    int cnt;
}fac[11];


int main(){
    int n, num = 0;
    //生成素数表,方便后续使用 
    find_prime();
    scanf("%d", &n);
    //如果为1则直接输出 
    if(n == 1)
        printf("1=1");
    else{
        printf("%d=", n);
        //一个结论:对于一个正整数n来说,如果它存在[2,n]范围内的质因子
        //要么这些质因子全部小于等于sqrt(n)
        //要么只存在一个对于sqrt(n)的质因子,而其余质因子全部小于等于sqrt(n) 
        //所以此处至少需要判断到sqrt处 
        int sqr = (int)sqrt(1.0*n);
        for(int i = 0; i < pnum && prime[i] <= sqr; i++){
            //如果prime[i]是n的因子 
            if(n % prime[i] == 0){
                //记录该因子 
                fac[num].x = prime[i];
                fac[num].cnt = 0;
                //计算该质因子prime[i]的个数 
                while(n % prime[i] == 0){
                    fac[num].cnt++;
                    n /= prime[i];
                }
                //不同质因子个数增加 
                num++;
            }
            //如果n提前为1则立即退出,节省时间 
            if(n == 1)
                break;
        }
        //如果无法被根号n以内的质因子除尽
        //则表示存在一个大于根号n的质因子,将其记录 
        if(n > 1){
            fac[num].x = n;
            fac[num++].cnt = 1;
        }
        //输出找到的质因子 
        for(int i = 0; i < num; i++){
            if(i > 0)
                printf("*");
            printf("%d", fac[i].x);
            if(fac[i].cnt > 1)
                printf("^%d", fac[i].cnt);
        }
    }
    return 0;
}





相关文章

  • 质因子分解(素数埃氏筛法)[PAT A1059]

    埃氏筛法原理质因子分解结论

  • 素数相关问题练习 C++

    辗转相除 素数判定 埃氏筛法

  • 机试常用算法和题型-数学专题

    数学专题,模拟 素数问题,普通筛和埃氏筛 另一种筛法,连续素数求和得超级素数 质因数 奇数魔方图 求小数的循环部分...

  • 判断素数-埃氏筛法的详解

    埃氏筛法 一个判断素数的高效算法 关于埃氏筛法的百度百科解释在这里埃拉托斯特尼筛法,当然我不可能给个百度百科的解释...

  • 数论

    数学问题 1. 质数筛 埃氏筛 利用当前已经找到的素数,从后面的数中筛去当前素数的倍数,由预备知识一可知,当前素数...

  • 204. Count Primes

    n以内素数的个数。 参考:埃拉托斯特尼筛法和素数判断 代码:

  • noip模板整理

    数论快速幂高精度加法减法乘法除法线性筛素数埃氏筛法 O(nlglgn)最大公约数(gcd)最小公倍数(lcm)扩展...

  • 埃氏筛(求素数)

    众多筛法中最简单且容易理解的一种,时间复杂度为O(nloglogn),在找到一个素数后,马上将所求范围内该素数的倍...

  • 求小于等于n的质数个数

    埃氏筛法(Eratosthenes筛选法)算法基本思想:要得到自然数n以内的全部素数,必须把不大于n1/2的所有素...

  • 埃氏筛法

    计算素数的一个方法:埃氏筛法 1.构造一个从3开始的奇数列 def _odd_iter(): n=1 whil...

网友评论

      本文标题:质因子分解(素数埃氏筛法)[PAT A1059]

      本文链接:https://www.haomeiwen.com/subject/ldpcthtx.html