Given any positive integer N, you are supposed to find all of its prime factors, and write them in the format N = p1k1×p2k2×⋯×pmkm.
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 = p1k1*p2k2*…*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
题目大意很清楚就是输入一个数N,将它分解成多个质数相乘的形式 N = p1k1*p2k2*…*pm^km,在程序里我们用一个结构体factor定义的这个数和他的系数,然后利用筛选法将素数筛选出来,由于n是int型的数(在这里要明白一个结论:一个数的质因子要么全小于他的sqrt,要么就只有一个比sqrt大的,剩余的的小于sqrt(n)),所以在这里只需要筛选10的5次方就够了,然后对那个大于sqrt(n)的进行特判,另外由于1不是质数也不是合数,所以如果N=1,也要进行特判
AC代码
#include<stdio.h>
#include<math.h>
const int maxn=100010;
bool p[maxn]={0};
int prime[maxn],num=0;
struct factor{
int x;
int cnt;
}fac[10];
void find_prime(){
for(int i=2;i<maxn;i++){
if(p[i]==false){
prime[num++]=i;
for(int j=i+i;j<maxn;j=j+i){
p[j]=true;
}
}
}
}
int main(){
int n;
scanf("%d",&n);
int temp=n;
if(n==1){
printf("1=1\n");
return 0;
}
find_prime();
int k=0;
for(int i=0;i<num;i++){
if(n%prime[i]==0){
fac[k].x=prime[i];
fac[k].cnt=0;
while(n%prime[i]==0){
fac[k].cnt++;
n=n/prime[i];
}
k++;
}
}
if(n!=1){
fac[k].x=n;
fac[k].cnt=1;
k++;
}
printf("%d=",temp);
for(int i=0;i<k;i++){
if(fac[i].cnt==1){
printf("%d",fac[i].x);
}else{
printf("%d^%d",fac[i].x,fac[i].cnt);
}
if(i<k-1){
printf("*");
}
}
printf("\n");
return 0;
}