【ACM】- PAT. A1059 Prime Factor 【数学问题 - 质因子分解】

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_26398495/article/details/82192228
题目链接
题目分析

(略)

解题思路:

质因子分解


AC程序(C++)
/**********************************
*@ID: 3stone
*@ACM: PAT.A059 Prime Factor
*@Time: 18/8/28
*@IDE: VSCode + clang++
***********************************/
#include<cstdio>
#include<algorithm>
#include<cmath>

using namespace std;

const int maxn = 100010;

//int范围内,素数表开到10^5就够用了!
int prime[maxn], pNum = 0; //素数表, 素数个数

//质因子 结构体 
struct Factor {
    int x; //质因子 
    int num; //个数
}fac[10]; //int范围内,10位够用了

//判断素数 
bool isPrime( int k) {
    if(k <= 1) return false;
    int sqt = sqrt(1.0 * k);
    for( int i = 2; i <= sqt; i++) {
        if(k % i == 0)
            return false;
    }
    return true;
}

//保存素数表 
void get_prime(int n) {
    for(int i = 2; i < n; i++)
        if(isPrime(i)){
            prime[pNum++] = i;
        }
}

//保存质因数信息
int get_factor(int N) {

    int count = 0, remain = N;
    int sqt = (int)sqrt(1.0 * N);
    for(int i = 0; i < pNum && prime[i] <= sqt; i++) {
        if(remain % prime[i] != 0) continue; //不是因数 
        fac[count].x = prime[i];
        fac[count].num = 0;
        while(remain % prime[i] == 0) {
            fac[count].num++;  //保存质因数信息 
            remain /= prime[i];
        }
        count++;
        if(remain == 1) break; //及时退出循环,节省时间
    }
    if(remain > 1) { //最后不为1的部分(无法被根号N内的质因子除尽)
        fac[count].x = remain;
        fac[count++].num = 1;
    }
    return count;
}


int main() {
    int N;
    get_prime(maxn);
    while(scanf("%d", &N) != EOF) {

        if(N == 1 || N == 0) { //特殊情况,否则一个测试点不过!!
            printf("%d=%d\n", N, N);
            continue;
        }

        int fac_num = get_factor(N); //质因子分解

        //输出
        printf("%d=", N);       
        for(int i = 0; i < fac_num - 1; i++) {
            if(fac[i].num != 1) printf("%d^%d*", fac[i].x, fac[i].num);
            else printf("%d*", fac[i].x);
        }
        if(fac[fac_num-1].num != 1) printf("%d^%d\n", fac[fac_num-1].x, fac[fac_num-1].num);
        else printf("%d\n", fac[fac_num-1].x);

    }

    return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_26398495/article/details/82192228