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

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

#include
#include
#include

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])