Advertisement

PAT A1059 Prime Factors(分解质因数板题)

阅读量:
描述

输入一个int范围内的整数,并将其分解为质因数的乘积形式,并按照从最小到最大的顺序输出

Sample Input:

97532468

Sample Output:

97532468=2^211171011291

Solution

分解质因数板题。注意:

  • 在int范围内进行正整数分解时,在维护一个包含不超过10,000个素因数的列表就足够了。
  • 当n等于1时,则必须单独处理这种情况。
  • 需确保在质因数分解过程中能够处理超过√n的质因数。
复制代码
    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <cstdio>
    #include <cmath>
    using namespace std;
    //数组不需要开到int型最大值那么大
    //分解质因数后质因数不会太大
    const int maxn = 10000;
    bool judge_prime[maxn];
    int prime[maxn];
    int num_fac, num_prime = 0;
    void get_prime()
    {
    // 素数筛法得到素数表
    memset(judge_prime, true, sizeof(judge_prime));
    judge_prime[1] = judge_prime[0] = false;
    for (int i = 2; i < maxn; i++)
    {
        if (judge_prime[i] == true)
            for (int j = i + i; j < maxn; j += i)
                judge_prime[j] = false;
    }
    for (int i = 2; i <= maxn; i++)
    {
        if (judge_prime[i])
            prime[num_prime++] = i;
    }
    }
    struct Factor
    {
    int x, count; //x为质因子,count为其个数初始化为0
    Factor()
    {
    	count=0;
    }
    } fac[100];
    void prime_factor(int n)
    {
    // n==1时单独处理
    if (n == 1)
        fac[num_fac++].x = 1, fac[num_fac].count = 1;
    else
    {
        // 从2到n的开方区间内判断质因数
        int bound = (int)sqrt(1.0 * n);
        for (int i = 0; i < num_prime && prime[i] <= bound; i++)
        {
            if (n % prime[i] == 0)
            {
                fac[num_fac].x = prime[i];
                while (n % prime[i] == 0)
                {
                    // 计算同一个质因数出现几次
                    n = n / prime[i];
                    fac[num_fac].count++;
                }
                num_fac++;
            }
        }
        // 如果无法被sqrt(n)以内的质因数除尽
        // 一定有一个>sqrt(n)的质因数
        if (n != 1)
        {
            fac[num_fac].x = n;
            fac[num_fac].count++;
            num_fac++;
        }
    }
    }
    int main()
    {
    // freopen("in.txt", "r", stdin);
    get_prime();
    int n;
    while (~scanf("%d", &n))
    {
        num_fac = 0;
        prime_factor(n);
        printf("%d=", n);
        for (int i = 0; i < num_fac; i++)
        {
            if (i > 0)
                printf("*");
            printf("%d", fac[i].x);
            if (fac[i].count > 1)
                printf("^%d", fac[i].count);
        }
        printf("\n");
    }
    return 0;
    }

全部评论 (0)

还没有任何评论哟~