【PAT】1059. Prime Factors (25)【素数表】

题目描述

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.

翻译:给你任意一个正整数N,你需要找出它的所有素数因子,并且按照N = p1^k1 * p2^k2 *…*pm^km的格式将它们打印出来。

INPUT FORMAT

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

翻译:每个输入文件包含一组测试数据,为给定的一个在long int范围内的正整数。

OUTPUT FORMAT

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.

翻译:将N分解为N = p1^k1 * p2^k2 *…*pm^km的格式,pi代表素数因子,按照升序排序,ki代表pi的指数,假如pi只有一个,那么1不能被输出。


Sample Input:

97532468

Sample Output:

97532468=2^2*11*17*101*1291


解题思路

这道题用打素数表即可,由于数据范围为1-2147483647,所以开10^5即可,不断除以素数表中的素数,如果最后退出循环时N仍不为1,则说明有超过sqrt[N]的根,直接添加到结果数组即可。注意1的情况,需要特殊处理。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<algorithm>
#define INF 99999999
using namespace std;
long long int N;
int v[100000];
int prim[10000],ccount=0;
long long int ans[10000],acount=0;
void init(){
    memset(v,0,sizeof(v));
    for(int i=2;i<100000;i++){
        if(!v[i]){
            prim[ccount++]=i;
            for(int j=i;j<100000;j+=i)v[j]=true;
        }
    }
} 
int main(){
    init();
    scanf("%d",&N);
    memset(v,0,sizeof(v));
    int pre=0;
    long long int n=N;
    while(N){
        int flag=0;
        for(int i=pre;i<ccount;i++){
            if(N%prim[i]==0){
                if(!v[prim[i]])ans[acount++]=prim[i];
                v[prim[i]]++;
                N/=prim[i];
                if(pre<i)pre=i;
                flag=1;
                break;
            }
        }
        if(flag==0){
            if(N!=1)ans[acount++]=N;
            break;
        }
    }
    printf("%lld=",n);
    for(int i=0;i<acount;i++){
        if(i!=0)printf("*");
        if(v[ans[i]]>1)printf("%lld^%d",ans[i],v[ans[i]]);
        else printf("%lld",ans[i]);
    }
    if(n==1)printf("1");
    printf("\n");
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值