题目:
Given any positive integer
N
N
N, you are supposed to find all of its prime factors, and write them in the format N =
p
1
p_1
p1^
k
1
k_1
k1×
p
2
p_2
p2^
k
2
k_2
k2×⋯×
p
m
p_m
pm^
k
m
k_m
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 =
p
1
p_1
p1^
k
1
k_1
k1*
p
2
p_2
p2^
k
2
k_2
k2…
p
m
p_m
pm^
k
m
k_m
km , where
p
i
p_i
pi's are prime factors of
N
N
N in increasing order, and the exponent
k
i
k_i
ki is the number of
p
i
p_i
pi – hence when there is only one
p
i
p_i
pi ,
k
i
k_i
ki is
1
1
1 and must NOT be printed out.
Sample Input:
97532468
Sample Output:
97532468=2^2*11*17*101*1291
注意点:
- N=1时需要单独处理输出“1=1”。
- 因为最多只会有一个大于sqrt(N)的质因数,因为N在int范围内(int 又称 long int)所以素数表开到 1 0 5 10^5 105 即可。
- 输出时需要小心。
代码:
#include <stdio.h>
#include <math.h>
const int MAX_N=100010;
//质因数结构
struct prime_factor{
int factor;
int pow=0;
};
int N;
bool find_prime[MAX_N]={false};
int prime[MAX_N];
prime_factor factors[MAX_N];
//计算范围n以内的素数表
int gen_prime(int n){
int num_prime=0;
for(int i=2;i<=n;i++){
if(find_prime[i]==false){
prime[num_prime++]=i;
for(int j=i+i;j<=n;j+=i)
find_prime[j]=true;
}
}
return num_prime;//返回生成的素数表长度
}
int main(){
scanf("%d",&N);
int s=sqrt(1.0*N);
int num_prime= gen_prime(s);
int index=-1,cnt=0;
printf("%d=",N);
//单独判断N==1的情况,否则不会有结果输出
if(N==1){
printf("1\n");
return 0;
}
//计算质因数
for(int i=0;i<num_prime;i++){
if(N%prime[i]==0){
index++;
cnt++;
}
while(N%prime[i]==0){
factors[index].factor=prime[i];
factors[index].pow++;
N/=prime[i];
}
}
//按照格式输出结果
for(int i=0;i<cnt;i++){
if(i<1) printf("%d",factors[i].factor);
else printf("*%d",factors[i].factor);
if(factors[i].pow!=1) printf("^%d",factors[i].pow);
}
if(N!=1){
if(cnt>0) printf("*%d\n",N);
else printf("%d\n",N);
}
else printf("\n");
return 0;
}