美文网首页
质因子分解(素数埃氏筛法)[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]

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