题目描述
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;
}