PAT - 甲级 - 1059. Prime Factors (25)(素数筛法)

本文介绍了一种通过素数筛法实现的质因数分解算法,该算法能够将任意正整数N分解为其所有质因数的形式,并按照质因数从小到大的顺序输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given any positive integer N, you are supposed to find all of its prime factors, and write them in the format N = p1^k1 * p2^k2 *…*pm^km.

Input Specification:

Each input file contains one test case which gives a positive integer N in the range of long int.

Output Specification:

Factor N in the format N = p1^k1 * p2^k2 *…*pm^km, where pi's are prime factors of N in increasing order, and the exponent ki is the number of pi -- hence when there is only one pi, ki is 1 and must NOT be printed out.

Sample Input:
97532468
Sample Output:
97532468=2^2*11*17*101*1291

1.先用素数晒法把求出素数然后再进行枚举


#include <cstdio>   
#include <iostream>  
#include <map>  
#include <set>  
#include <vector>  
#include <cmath>  
#include <string>  
#include <cstring>  
#include <algorithm>  
#define LL long long  
#define MAXN 100000  
using namespace std;  
/* 
素数筛法  
*/  
int valid[MAXN+1];  
int prime[MAXN+1];  
int tot;  
void getPrime(){  
    memset(valid, 0, sizeof(valid));  
    tot = 0;  
    for(int i = 2; i <= MAXN; i++){  
        if(!valid[i]){  
            prime[tot++] = i;  
        }  
        for(int j = 0; (j < tot) && (i*prime[j] <= MAXN); j++){  
            valid[i*prime[j]] = 1;  
            if(i%prime[j] == 0) break;  
        }  
    }  
}   
int main(){  

    getPrime(); 
    long long x; 
    scanf("%lld", &x);
    printf("%lld=", x);
    if(x == 1){
    	printf("1\n");
    	return 0;
    }
    for(int i = 0; x > 1 && i < tot; i++){  
    	int time = 0;
    	while(x%prime[i] == 0) {
    		time++;
    		x /= prime[i];
    	}
    	if(time == 0) continue;
    	
    	if(time == 1) {
    		printf("%d", prime[i]);
    	} else {
    		printf("%d^%d", prime[i], time);
    	}
    	if(x > 1) {printf("*");}
    } 
    printf("\n");
    return 0;  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值